2011-09-22 62 views

回答

1

是一個SQL Server 2000表中可以沒有主鍵,包含重複的記錄是你可以簡單地創建一個表,而不需要定義任何約束。但我不會建議這一點。

相反,因爲您正在爲其他表創建審計表。比方說,在這個例子中,你有一個人員表和一個人員審計表,用於跟蹤人員表中的變化。

創建審計表像這樣

CREATE TABLE dbo.PersonAuditID 
(
    PersonAuditID int NOT NULL IDENTITY (1, 1), 
    PersonId int NOT NULL, 
    FirstName nvarchar(50) NOT NULL, 
    LastName nvarchar(50) NOT NULL, 
    PersonWhoMadeTheChange nvarchar(100) NOT NULL, 
    TimeOfChange datetime NOT NULL, 
    ChangeAction int NOT NULL, 
    /* any other fields here*/ 
    CONSTRAINT [PK_PersonAudit] PRIMARY KEY NONCLUSTERED 
    (
[PersonAuditID] ASC 
) 
) ON [PRIMARY] 

這會給你一個主鍵,並保持表的唯一記錄。它還能夠跟蹤誰進行了更改,何時進行了更改以及更改是插入,更新還是刪除。

你的觸發器將類似於以下

CREATE TRIGGER Insert_PERSON 
    ON PERSON 
    AFTER INSERT 
AS 
BEGIN 
    SET NOCOUNT ON; 
    INSERT INTO PERSONAUDIT 
    (PersonID, 
    FirstName, 
    LastName, 
    PersonWhoMadeTheChange, 
    TimeOfChange, 
    ChangeAction, 
    ... other fields here 
    SELECT 
     PersonID, 
     FirstName, 
     LastName, 
     User(), 
     getDate(), 
     1, 
     ... other fields here 
    FROM INSERTED 

END 

CREATE TRIGGER Update_PERSON 
    ON PERSON 
    AFTER UPDATE 
AS 
BEGIN 
    SET NOCOUNT ON; 
    INSERT INTO PERSONAUDIT 
    (PersonID, 
    FirstName, 
    LastName, 
    PersonWhoMadeTheChange, 
    TimeOfChange, 
    ChangeAction, 
    ... other fields here 
    SELECT 
     PersonID, 
     FirstName, 
     LastName, 
     User(), 
     getDate(), 
     2, 
     ... other fields here 
    FROM INSERTED 

END 

CREATE TRIGGER Delete_PERSON 
    ON PERSON 
    AFTER DELETE 
AS 
BEGIN 
    SET NOCOUNT ON; 
    INSERT INTO PERSONAUDIT 
    (PersonID, 
    FirstName, 
    LastName, 
    PersonWhoMadeTheChange, 
    TimeOfChange, 
    ChangeAction, 
    ... other fields here 
    SELECT 
     PersonID, 
     FirstName, 
     LastName, 
     User(), 
     getDate(), 
     3, 
     ... other fields here 
    FROM DELETED 

END 
+0

看起來你的答案的最後一位缺失 – nykash

+0

感謝您的回答。但是,我有一個'on edit:insert'觸發器,其中主表的PK元組可以將PK相同的記錄插入到審計表中。 – ppecher

+0

@ppecher由於身份列和主鍵,此結構將無法輸入PersonAudit表的相同記錄。但是,它將允許您將相同的人員表記錄輸入到PersonAudit表中。 –

2

是沒有主鍵或唯一約束的表可以是重複的

例如行

CREATE TABLE bla(ID INT) 


INSERT bla (ID) VALUES(1) 
INSERT bla (ID) VALUES(1) 
INSERT bla (ID) VALUES(1) 


SELECT * FROM bla 
GO 
1

的SQL Server 2000 +,可以有不表PK。是的,你通過不使用約束來創建它們。

3

是的,這是可能的,但不一定是個好主意。沒有主鍵,複製和高效索引將非常困難。

1

對於審計表,您需要考慮您可能使用的審計數據。即使您沒有進行審計,以便在發生不幸更改時以特殊方式恢復記錄,它們也不可避免地被用於此目的。如果您有一個代理鍵,可以更輕鬆地識別要恢復的記錄,從而防止您在只需要最近的時間內意外恢復其他30個條目?鍵值是否可以幫助您識別在一批中需要恢復的32,578條記錄?

我們爲審計做的事情是每個表有兩個表,一個存儲關於已更改記錄批次的信息,包括自動遞增的id,用戶,應用程序,日期時間和受影響記錄的數量。子表然後將該ID用作fk,並存儲關於插入/更新/刪除的每個記錄的舊值和新值的詳細信息。當一個進程錯誤導致很多記錄被偶然改變時,這真的幫助我們。

+0

非常好的觀點。謝謝 – ppecher

相關問題