2011-02-28 111 views
3

我有2個表 - EmpDetails & ChangeLog列約束

EmpDetails員工的存儲信息 - 它具有ID, Name

ChangeLog用於登錄更改員工詳細信息 - 它有ID, DateOfChange, ChangeDescription

我想確保ChangeLog.ID是包含在EmpDetails.ID列中的值。

於是,我把使用用戶定義函數的CHECK約束爲ChangeLog.ID列(UDF中檢查是否存在EmpDetails.IDID與否)

我的問題是 - 如果是一個特定的ID行從EmpDetails中刪除,如果在ChangeLog中有ID的行,會出現錯誤嗎?

這似乎並非如此...我不明白爲什麼。

那麼,我將如何獲得這樣的功能?我能想到的一種方法是在EmpDetails上創建刪除操作的觸發器。

對上述問題的其他解決方案?

編輯 - 我試着指定一個外鍵關係。但ChangeLog中的ID不是關鍵,因爲ChangeLog表可以包含同一ID的多個記錄(我的意思是,員工可以多次更改其詳細信息,因此ChangeLog中的相同ID將會有多於一條記錄)。即使在這種情況下,我是否應該能夠指定外鍵關係?

+0

您應該將'EmployeeID INT'添加到您的ChangeLog中,然後引用'ChangeLog.EmployeeID - > EmpDetails.ID' – 2011-02-28 14:31:05

+0

我需要做的是 - 我必須在EmpDetails中指定ID爲'unique'以使其成爲鍵,用於外鍵關係。之前它被標記爲「身份」......(我認爲這會使它成爲關鍵)。在我的情況下,ID + 2個其他列組成主鍵。 – user637563 2011-02-28 15:08:46

回答

1

ChangeLog表中的檢查約束,而不是EmpDetails,所以當您修改EmpDetails時,它不會被檢查。 SQL服務器不夠智能,無法確定在其他表更改時您希望檢查運行。但是,如果您只是想確保EmpDetails表中有一行,爲什麼不使用簡單的參照完整性規則(又名外鍵)呢?

+0

我試圖指定一個外鍵關係。但ChangeLog中的ID不是關鍵,因爲ChangeLog表可以包含同一ID的多個記錄(我的意思是,員工可以多次更改其詳細信息,因此ChangeLog中的相同ID將會有多於一條記錄)。即使在這種情況下,我是否應該能夠指定外鍵關係? – user637563 2011-02-28 14:19:11

+0

您需要反過來指定它(假設ID是EmpDetails中的一個鍵),ChangeLog.ID引用EmpDetails.ID字段。 – SWeko 2011-02-28 14:22:50

+0

我需要做的是 - 我必須在EmpDetails中將ID指定爲'unique'才能使其成爲一個密鑰,以用於外鍵關係。之前它被標記爲「身份」......(我認爲這會使它成爲關鍵)。在我的情況下,ID + 2個其他列組成主鍵。 – user637563 2011-02-28 14:53:56

3

你所描述的是一個foreign key的關係。執行它:

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

SQL Server然後將保持關係爲您,而不需要您的UDF。如果EmpDetails中的對應行不存在,則對ChangeLog的插入將失敗,如果在ChangeLog中存在匹配的行,則從EmpDetails刪除將失敗。

+0

,這也可以讓你定義像'ON DELETE CASCADE'設置.. – 2011-02-28 14:16:31