在SQL Server 2008 R2上创建触发器以捕获记录更新

Tom*_*Tom 2 t-sql sql-server triggers sql-server-2008

在这里使用Great Plains和我们的一个用户不断搞砸客户数据,因此我们想在客户表上设置一个触发器,这样我们就能找出它是谁.

无论如何,我创建了一个名为audit_RM00101的表,如下所示:

DATE        nchar(10)   
CUSTNMBR    char(15)    
CUSTNAME    char(65)    
UPSZONE     char(3) 
SALSTERR    char(15)    
USERID      nchar(100)
Run Code Online (Sandbox Code Playgroud)

我想从我想要审计的表中捕获那些相同的字段,所以我按如下方式编写了触发器:

CREATE TRIGGER CatchCustomerRegionUpdate
ON RM00101
FOR UPDATE
AS
DECLARE @UserID VARCHAR(128)
SELECT @UserID = system_user
INSERT INTO audit_RM00101 
SELECT DATE, CUSTNMBR, CUSTNAME, UPSZONE, SALSTERR, @UserID FROM UPDATED
Run Code Online (Sandbox Code Playgroud)

触发器创建得很好但是当我尝试通过更新Great Plains中的客户记录来测试它时,Great Plains会抛出一个丑陋的错误并且触发器不会被触发.

我在这做错了什么?

谢谢.

KM.*_*KM. 5

在一个触发器中,你得到DELETEDINSERTED表,没有UPDATED,所以替换FROM UPDATEDFROM INSERTED

还尝试修复你的USERID列,你audit_RM00101.USERID是一个nchar(100)虽然@UserID是一个VARCHAR(128).

编辑基于OP评论:啊,所以没有办法审核何时使用触发器更新表?

  • 在删除时触发器中,DELETED已填充,但INSERTED为空
  • 在更新时触发器中,DELETED使用原始值INSERTED填充,并使用新更新的值填充
  • 在插入时的触发,DELETED是空的,但INSERTED有新插入的值