我有一个审计表,而不是定义一个标识或出票的列,我正在考虑只是推送记录表的记录(通过触发器)。
SQL Server 2000表是否没有PK,因此包含重复记录?
如果是,我所要做的就是创建表而不对其定义任何约束吗?
答案 0 :(得分:3)
是的,这是可能的,但不一定是个好主意。没有主键,复制和高效索引将非常困难。
答案 1 :(得分: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
答案 2 :(得分:1)
是的,SQL Server 2000表没有主键并且包含重复记录,是的,您可以简单地创建表而不对其定义任何约束。但我不建议这样做。
相反,因为您要为另一个表创建审计表。让我们说,对于这个例子,你有一个Person Table和一个Person Audit表来跟踪person表中的变化。
像这样创建审计表
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
答案 3 :(得分:1)
SQL Server 2000+,可以拥有没有PK的表。是的,你不使用约束来创建它们。
答案 4 :(得分:1)
对于审计表,您需要考虑使用审计数据的内容。即使您在进行不幸的更改时没有进行审计以便用于恢复记录,它们也不可避免地用于此目的。如果您有一个代理键可以防止在您只想要最新的时候意外恢复其他30个条目,那么识别要恢复的记录会更容易吗?键值是否可以帮助您识别需要还原的一批中删除的32,578条记录?
我们为审计做的是每个表有两个表,一个存储有关已更改记录批次的信息,包括自动递增ID,用户,应用程序,日期时间,受影响记录的数量。子表然后使用ID作为fk并存储有关插入/更新/删除的每个记录的旧值和新值的详细信息。当进程错误导致许多记录意外更改时,这确实有助于我们。