2011-09-22 51 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

相关问题