如何在触发器中使用文本列

时间:2010-04-19 17:36:16

标签: sql sql-server tsql sql-server-2000 triggers

我正在尝试在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而不是删除,但因为插入触发器在插入后触发,所以当我想要原始记录时,它最终会将新记录插入到历史记录表中。

我该怎么做呢,仍然使用文字栏?

2 个答案:

答案 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以来已经有一段时间了)

  • 你能使用INSTEAD OF触发器吗?
  • 什么是兼容级别?

答案 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