我尝试创建一个触发器:
CREATE TRIGGER DataTrigger ON Data AFTER INSERT , DELETE
AS
BEGIN
IF EXISTS(SELECT * FROM Inserted)
INSERT INTO [dbo].[AuditTrail]
([ActionType]
,[TableName]
,[Name]
,[Time])
('INSERT' //Incorrect syntax near 'INSERT'
,'Data'
,SELECT col1 FROM Inserted
,CURRENT_TIMESTAMP //Incorrect syntax near the keyword 'CURRENT_TIMESTAMP')
END
但它一直说我有错误,有人可以告诉我哪里做错了吗?
P / S:检测更新的最佳方法是什么?
谢谢
答案 0 :(得分:4)
CREATE TRIGGER DataTrigger ON Data AFTER INSERT , DELETE
AS
BEGIN
INSERT INTO [dbo].[AuditTrail]
([ActionType]
,[TableName]
,[Name]
,[Time])
SELECT 'INSERT'
,'Data'
,col1
,CURRENT_TIMESTAMP
FROM Inserted
END
只是为了澄清。
您的查询,如果在插入多行时,如果语法正确将失败,则上述版本允许多次插入。
IF EXISTS
是多余的,这就是它被移除的原因,如果没有行,则不会在审计表中插入。
如果您想审核DELETE
,您需要再次使用类似的声明,但使用Deleted
表而不是Inserted
要审核UPDATE
,请为每个更新的行创建一个新的触发器,您在Inserted
中获得包含新更新的条目,并在Deleted
中使用旧数据获取条目,您可以如果你想追踪旧的和新的,请加入这些。
答案 1 :(得分:3)
CREATE TRIGGER DataTrigger ON Data AFTER INSERT , DELETE
AS
BEGIN
INSERT INTO [dbo].[AuditTrail]
([ActionType]
,[TableName]
,[Name]
,[Time])
SELECT 'INSERT', 'Data', col1, CURRENT_TIMESTAMP FROM Inserted
END
答案 2 :(得分:1)
我不完全确定你要在这里完成什么,所以我刚刚纠正了语法以使其工作,但它应该有所帮助。我也尝试过处理已删除的案例
CREATE TRIGGER DataTrigger
ON Data
AFTER INSERT , DELETE
AS
BEGIN
INSERT INTO [dbo].[AuditTrail]([ActionType],
[TableName],
[Name],
[Time])
SELECT 'INSERT','Data', col1, CURRENT_TIMESTAMP
FROM Inserted
INSERT INTO [dbo].[AuditTrail]([ActionType],
[TableName],
[Name],
[Time])
SELECT 'DELETE','Data', col1, CURRENT_TIMESTAMP
FROM Deleted
END