contrainte de colonne qui utilise une fonction définie par l'user (udf)

J'ai 2 tables – EmpDetails & ChangeLog

EmpDetails stocke les détails des employés – il a l' ID, Name etc.

ChangeLog est utilisé pour consigner les modifications apscopes aux détails de l'employé – il a ID, DateOfChange, ChangeDescription , etc.

Je voulais m'assurer que ChangeLog.ID est une valeur contenue dans la colonne EmpDetails.ID .

Donc, j'ai mis une contrainte CHECK en utilisant une fonction définie par l'user pour la colonne ChangeLog.ID dans (l'UDF vérifie si l' ID existe dans EmpDetails.ID ou non)

Ma question est – si la rangée d'un ID particulier est supprimée de EmpDetails , une erreur sera-t-elle levée s'il y a des lignes pour cet ID dans ChangeLog ?

Cela ne semble pas être le cas … Et je ne comprends pas pourquoi.

Alors, comment pourrais-je get une telle fonctionnalité? Une façon dont je peux penser est de créer un triggersur pour les opérations de suppression sur EmpDetails .

Toute autre solution au problème ci-dessus?

EDIT – J'ai essayé de spécifier une relation de key étrangère. Mais ID dans ChangeLog n'est pas une key car la table ChangeLog peut contenir plusieurs loggings pour le même ID (je veux dire, les employés peuvent changer leurs détails plus d'une fois, donc il y aura plus d'un logging pour le même ID dans ChangeLog). Dois-je être en mesure de spécifier une relation de key étrangère, même dans ce cas?

La contrainte de vérification est dans la table ChangeLog, pas sur EmpDetails, donc quand vous modifiez EmpDetails, elle n'est simplement pas vérifiée. Le server SQL n'est pas assez intelligent pour comprendre que vous souhaitez que la vérification soit exécutée lorsqu'une autre table est modifiée.

Mais, si vous voulez juste vous assurer qu'il y a une ligne dans la table EmpDetails, pourquoi ne pas utiliser une simple règle d'intégrité référentielle (alias une key étrangère)?

Ce que vous décrivez est une relation de key étrangère . Pour l'appliquer:

 ALTER TABLE ChangeLog ADD CONSTRAINT FK_EmpDetailsId FOREIGN KEY (ID) REFERENCES EmpDetails (ID); 

SQL Server maintiendra alors la relation pour vous, sans avoir besoin de votre FDU. Les insertions vers ChangeLog échoueront si la ligne correspondante dans EmpDetails n'existe pas et les suppressions de EmpDetails échoueront s'il y a une ligne correspondante dans ChangeLog.