Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment rendre les contraintes de clé étrangère fiables ?

Sur la base de vos exemples, j'ai également essayé :

  • Déposez et recréez la clé étrangère.
  • Déposez et recréez le tableau.

Puis j'ai remarqué quelque chose dans la commande :

NOT FOR REPLICATION

Il semble que si une contrainte est créée avec NOT FOR REPLICATION, elle n'est toujours pas approuvée.

Citant de Livres en ligne :

Il ressemble au IS_NOT_TRUSTED le paramètre est uniquement pertinent pour la réplication influencé par IS_NOT_FOR_REPLICATION . Je suppose que tant que la contrainte est appliquée sur le serveur sur lequel vous travaillez, cela devrait aller. Alors je suis allé de l'avant et je l'ai confirmé :

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.

Si vous voulez toujours voir IS_NOT_TRUSTED = 0 pour avoir l'esprit tranquille, recréez simplement la clé étrangère sans NOT FOR REPLICATION .

Au cas où ceux d'entre vous se poseraient la question, j'ai également vérifié le même effet sur les contraintes CHECK.