Pergunta

Eu tenho uma tabela, departamento, com vários campos de bits para indicar os tipos de departamento Um deles é Armazém (quando verdadeira, indica o departamento de armazém)

E eu tenho outra tabela, ManagersForWarehouses com seguinte estrutura:

ID autoinc
WarehouseID int (foreign key reference DepartmentID from departments)
ManagerID int (foreign key reference EmployeeID from employees)
StartDate
EndDate

Para definir novo gerente de armazém, eu inserir nesta tabela com EndDate nulo, e eu tenho um gatilho que conjuntos EndDate para recorde anterior para esse armazém = StartDate para novo gerente, portanto, um único aparece gerente de um armazém em um determinado tempo.

Quero acrescentar duas restrições de verificação da seguinte forma, mas não sabe como fazer isso

  1. não permitem inserir ManagersForWarehouses se WarehouseID não está marcado como armazém
  2. Não permita a Armazém desmarque se existem registros em ManagersForWarehouses

Graças

Foi útil?

Solução

  1. mesa em departamentos, adicione uma restrição exclusiva (DepartmentID, IsWarehouse)
  2. Em ManagersForWarehouses mesa, coluna add IsWarehouse, e têm uma restrição CHECK impor que IsWarehouse = 'Y'
  3. Em ManagersForWarehouses mesa, adicionar uma FK em (WarehouseID, IsWarehouse) referrring de Departamentos (DepartmentID, IsWarehouse), e com a cláusula ON UPDATE CASCADE.

E está tudo pronto com integridade sólida 100% rock, sem quaisquer lacunas. restrições Apenas confiáveis ??não têm quaisquer lacunas. Triggers são menos confiáveis.

Outras dicas

Você deve usar um gatilhos para fazer isso. Um em cada mesa. Certifique-se de conta para vários recordes inserções, atualizações ou exclusões. Para fazer qualquer outra coisa seria colocar seus dados em risco. Os dados não entrar em bancos de dados somente a partir de aplicações. Você não pode dar ao luxo de aplicar esse tipo de coisa a partir da aplicação a menos que você deseja que os dados que está incorreta e inútil.

Não coloque este tipo de restrições sobre a mesa de DB.
É melhor para fazer valer tal coisa usando o código (lógica de negócio).

EDIT: Não relacionado à sua pergunta, mas você não deve usar o gatilho, bem como para efectuar actualizações para outras linhas. Eu não tenho laços sólidos para apoiá-la com.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top