Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Come rendere affidabili i vincoli di chiave esterna?

Sulla base dei tuoi esempi, ho provato anche:

  • Rilascia e ricrea la chiave esterna.
  • Rilascia e ricrea il tavolo.

Poi ho notato qualcosa nel comando:

NOT FOR REPLICATION

Sembra che se viene creato un vincolo con NOT FOR REPLICATION, non è sempre attendibile.

Citazione da Libri in linea :

Sembra il IS_NOT_TRUSTED l'impostazione è rilevante solo per la replica influenzato da IS_NOT_FOR_REPLICATION . Immagino che fintanto che il vincolo viene applicato sul server su cui stai lavorando, dovrebbe andare bene. Quindi sono andato avanti e l'ho confermato:

SELECT name, is_disabled, is_not_trusted
FROM sys.foreign_keys
WHERE name = 'FK_Product_ProductKeyId'

name                    is_disabled is_not_trusted
FK_Product_ProductKeyId 0            1

INSERT INTO dbo.Sale VALUES (2, GETDATE(), 1.00)

Msg 547, Level 16, State 0, Line 1
The INSERT statement conflicted with the FOREIGN KEY constraint "FK_Product_ProductKeyId". The conflict occurred in database "_Scratch", table "dbo.Product", column 'ProductKeyId'.
The statement has been terminated.

Se vuoi ancora vedere IS_NOT_TRUSTED = 0 per la massima tranquillità, basta ricreare la chiave esterna senza NOT FOR REPLICATION .

Nel caso in cui se lo stessero chiedendo, ho verificato lo stesso effetto anche sui vincoli CHECK.