首先发布在这里。
我想创建一个触发器,以便当有人尝试更新表时,它会阻止更新并将尝试记录在审计表中。
USE [AdventureWorks2008R2]
GO
SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [Person].[Lastname_Trigger]
ON [Person].[Person]
FOR UPDATE AS
IF UPDATE (Lastname)
BEGIN
INSERT INTO SurnameChange (BusinessEntityID, Firstname, OldLastName, NewLastName,AttemptedBy, Timestamped)
SELECT
d.businessentityid,
i.firstname,
d.lastname,
i.lastname,
SUSER_SNAME(),
GETDATE()
FROM deleted d , inserted i
WHERE d.businessentityid = i.businessentityid
END
/*This is where it is going wrong*/
BEGIN TRANSACTION
IF UPDATE(lastname)
BEGIN
RAISERROR ('cannot change lastname', 16, 1)
ROLLBACK TRANSACTION
RETURN
END
如果有人可以帮助我,那就太棒了,我已经使用AdventureWorks作为示例,因此它是通用的,可用于其他人。
非常感谢。
詹姆斯
答案 0 :(得分:1)
试试这个:
SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [Person].[Lastname_Trigger]
ON [Person].[Person]
FOR UPDATE AS
IF UPDATE (Lastname)
BEGIN
INSERT INTO SurnameChange (BusinessEntityID, Firstname, OldLastName, NewLastName,AttemptedBy, Timestamped)
SELECT
d.businessentityid,
i.firstname,
d.lastname,
i.lastname,
SUSER_SNAME(),
GETDATE()
FROM deleted d
INNER JOIN inserted i ON d.businessentityid = i.businessentityid
RAISERROR ('cannot change lastname', 16, 1)
ROLLBACK TRANSACTION
END
RETURN
如果LastName
已更新,我认为没有任何理由(a)再次检查 ,(b)确实没有必要在触发器内启动事务。< / p>
由于您希望阻止实际发生UPDATE
- 只需ROLLBACK
已经进行中的事务(对于{{1}命令)并完成它。
附注:请升级您的SQL专有技术以适应“新”正确的ANSI SQL UPDATE
语法(使用SQL引入 20多年前 -92标准) - 使用JOIN
和INNER JOIN
等并停止使用以逗号分隔的表格列表