我正在尝试在SQL Server 2000中使用更新触发器,以便在更新发生时,我在历史表中插入一行,因此我保留了表中的所有历史记录:
CREATE Trigger trUpdate_MyTable ON MyTable
FOR UPDATE
AS
INSERT INTO
[MyTableHistory]
(
[AuditType]
,[MyTable_ID]
,[Inserted]
,[LastUpdated]
,[LastUpdatedBy]
,[Vendor_ID]
,[FromLocation]
,[FromUnit]
,[FromAddress]
,[FromCity]
,[FromProvince]
,[FromContactNumber]
,[Comment])
SELECT
[AuditType] = 'U',
D.*
FROM
deleted D
JOIN
inserted I ON I.[ID] = D.[ID]
GO
当然,我收到错误
不能在'inserted'和'deleted'表中使用text,ntext或image列。
我尝试加入MyTable
而不是删除,但因为插入触发器在插入后触发,所以当我想要原始记录时,它最终会将新记录插入到历史记录表中。
我该怎么做呢,仍然使用文字栏?
答案 0 :(得分:1)
According to SQL Server 2000 CREATE TRIGGER
在DELETE,INSERT或UPDATE中 触发器,SQL Server不允许 text,ntext或image列 插入和删除中的引用 表,如果兼容级别是 等于70.文本,ntext和 插入和中的图像值 删除的表无法访问。至 在一个中检索新值 INSERT或UPDATE触发器,加入 插入表与原始 更新表。 ...
如果兼容级别为80或 更高,SQL Server允许更新 text,ntext或image列 通过INSTEAD OF触发器 表格或观点。
所以,如果我读得正确的话(自从我使用'2000以来已经有一段时间了)
答案 1 :(得分:0)
执行此操作的唯一方法是将当前行保留在历史记录表中。执行您尝试的操作并加入实际表,并将当前实际表中的所有列插入到历史表中。
你可能有这样的东西,历史只有一行的先前版本:
YourTable
ID value1 value2
1 AAA AAAA
2 BBB BBBB
3 CCC CCC3
YourTableHostory
HistoryID HistoryDate ID value1 value2
1 4/17/2010 2 CCC CCCC
2 4/18/2010 2 CCC CCC1
我说要做这样的事情,每个版本都存储在其中:
YourTable
ID value1 value2
1 AAA AAAA
2 BBB BBBB
3 CCC CCC3
YourTableHostory
HistoryID HistoryDate ID value1 value2
1 4/10/2010 1 AAA AAAA
2 4/10/2010 2 BBB BBBB
3 4/10/2010 3 CCC CCCC
4 4/17/2010 2 CCC CCC1
5 4/18/2010 2 CCC CCC2
5 4/19/2010 2 CCC CCC3
这种方式只要有插入或更新,只需将当前行插入历史表中,就会有当前行的副本,但这并不是那么糟糕。
如果您只是将此触发器添加到包含数据的现有表中,请运行此类查询以预先填充所有当前值:
INSERT INTO YourTableHostory
(HistoryDate,ID,value1,value2)
SELECT
GETDATE(),ID,value1,value2
FROM YourTable