我有一个审计表,而不是定义一个身份或票列,我正在考虑只是推入记录表(通过触发器)的记录。SQL Server 2000表可以没有PK,因此包含重复的记录吗?
SQL Server 2000表可以没有PK,因此包含重复的记录吗?
如果是,我所要做的所有工作都包含CREATING TABLE而不定义任何约束吗?
我有一个审计表,而不是定义一个身份或票列,我正在考虑只是推入记录表(通过触发器)的记录。SQL Server 2000表可以没有PK,因此包含重复的记录吗?
SQL Server 2000表可以没有PK,因此包含重复的记录吗?
如果是,我所要做的所有工作都包含CREATING TABLE而不定义任何约束吗?
是一个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
是没有主键或唯一约束的表可以是重复的
例如行
CREATE TABLE bla(ID INT)
INSERT bla (ID) VALUES(1)
INSERT bla (ID) VALUES(1)
INSERT bla (ID) VALUES(1)
SELECT * FROM bla
GO
的SQL Server 2000 +,可以有不表PK。是的,你通过不使用约束来创建它们。
是的,这是可能的,但不一定是个好主意。没有主键,复制和高效索引将非常困难。
对于审计表,您需要考虑您可能使用的审计数据。即使您没有进行审计,以便在发生不幸更改时以特殊方式恢复记录,它们也不可避免地被用于此目的。如果您有一个代理键,可以更轻松地识别要恢复的记录,从而防止您在只需要最近的时间内意外恢复其他30个条目?键值是否可以帮助您识别在一批中需要恢复的32,578条记录?
我们为审计做的事情是每个表有两个表,一个存储关于已更改记录批次的信息,包括自动递增的id,用户,应用程序,日期时间和受影响记录的数量。子表然后将该ID用作fk,并存储关于插入/更新/删除的每个记录的旧值和新值的详细信息。当一个进程错误导致很多记录被偶然改变时,这真的帮助我们。
非常好的观点。谢谢 – ppecher
看起来你的答案的最后一位缺失 – nykash
感谢您的回答。但是,我有一个'on edit:insert'触发器,其中主表的PK元组可以将PK相同的记录插入到审计表中。 – ppecher
@ppecher由于身份列和主键,此结构将无法输入PersonAudit表的相同记录。但是,它将允许您将相同的人员表记录输入到PersonAudit表中。 –