Domanda

Ho una tabella, dipartimento, con diversi campi di bit per indicare i tipi di reparto Uno è Magazzino (se vero, indica che il dipartimento è magazzino)

E ho un'altra tabella, ManagersForWarehouses con la seguente struttura:

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

Per impostare un nuovo gestore per il magazzino, inserisco questa tabella con EndDate null e ho un trigger che imposta EndDate per il record precedente per quel magazzino = StartDate per il nuovo gestore, quindi viene visualizzato un singolo gestore per un magazzino in un determinato tempo.

Voglio aggiungere due vincoli di controllo come segue, ma non sono sicuro su come farlo

  1. non consente l'inserimento in ManagersForWarehouses se WarehouseID non è contrassegnato come magazzino
  2. Non consentire di deselezionare Warehouse se sono presenti record in ManagersForWarehouses

Grazie

È stato utile?

Soluzione

  1. Nella tabella Dipartimenti, aggiungere un vincolo univoco (DepartmentID, IsWarehouse)
  2. Nella tabella ManagersForWarehouses, aggiungere la colonna IsWarehouse e fare in modo che un vincolo CHECK imponga che IsWarehouse = 'Y'
  3. Nella tabella ManagersForWarehouses, aggiungere un FK su (WarehouseID, IsWarehouse) facendo riferimento a Dipartimenti (DepartmentID, IsWarehouse) e con la clausola ON UPDATE CASCADE.

E il gioco è fatto con integrità solida al 100%, senza scappatoie. Solo i vincoli di fiducia non hanno scappatoie. I trigger sono meno affidabili.

Altri suggerimenti

Dovresti usare un trigger per farlo. Uno su ogni tavolo. Assicurati di tenere conto di più inserimenti, aggiornamenti o eliminazioni di record. Fare qualsiasi altra cosa significherebbe mettere a rischio i tuoi dati. I dati NON entrano nei database solo dalle applicazioni. Non puoi permetterti di applicare questo genere di cose dall'applicazione a meno che non desideri dati errati e inutili.

Non inserire questo tipo di vincoli nella tabella DB.
È meglio imporre una cosa del genere utilizzando il codice (logica aziendale).

MODIFICA: non correlato alla tua domanda, ma non dovresti usare anche il trigger per eseguire aggiornamenti su altre righe. Non ho collegamenti solidi con cui eseguire il backup.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top