我需要一些数据库触发器的帮助,但我无法正常工作。披露:我不是一个DBA,并且不要求任何专业知识,但我一直在负责完成这一操作..SQL Server 2008触发器错误
也就是说,这里的问题陈述:
我有一个数据库我们想跟踪更新/插入/删除的几个表。触发器应该捕捉某些列的“之前”和“之后”值,同时附带一些附加信息(如下所述)并将它们添加到表中。
我已经把我认为应该工作基础上的教程和其他信息可在各种网站,但无论我做什么,当我尝试创建触发器它总是抛出一个错误:
Msg 311, Level 16, State 1, Procedure tr_taskconstructs_U, Line 38
Cannot use text, ntext, or image columns in the 'inserted' and 'deleted' tables.
为我申请的触发器表中的列布局很简单:
ResourceID (PK, nvarchar(38))
AML (ntext, null)
我要赶更改AML
列并插入转变为一个表,如下所示:
id (int, not null),
ResourceID (nvarchar(38)),
TableName (nvarchar(50)),
DateTime (datetime),
Type (varchar(20)),
Before (ntext),
After (ntext)
我的代码如下:
CREATE TRIGGER tr_taskconstructs_U ON taskconstructs AFTER UPDATE
AS
BEGIN
SET NOCOUNT ON;
DECLARE @before nvarchar(max),
@after nvarchar(max),
@resource nvarchar(50)
IF UPDATE(AML)
BEGIN
SELECT @before = d.AML,
@after = i.AML,
@resource = d.ResourceID
FROM inserted i
INNER JOIN deleted d on d.ResourceID = i.ResourceID
INSERT INTO versioncontrol
VALUES (@resource, 'taskconstructs', GetDate(), 'Update', @before, @after)
END
END
GO
它总是失败,上面提到的错误。我试着改变变量的数据类型等,结果相同。我试过评论几乎所有的东西,它也有同样的错误。我显然缺少一些东西,但我无法弄清楚什么。
任何帮助,将不胜感激。
@Nenand - 您对INSTEAD OF UPDATE的解决方案非常完美。由于该应用程序是商业应用程序,因此我将运行此应用程序,并且我不知道如何更改他们的某个系统表会影响应用程序。同时也非常感谢你在多行上的发现......你让我看起来像英雄。 :) – user2093445
@ user2093445 YW! :)至于改变列类型 - 虽然我不会建议你做任何事情,而不先咨询任何负责非生产环境中的应用程序和测试的人。 - 我认为从'ntext'切换到'nvarchar(max)'应该没有任何问题,而不需要改变应用程序。 http://www.sqlfiddle.com/#!6/2d9b1/2 –