1.基于数据库的触发器
SQL语句:
CREATE TRIGGER databaseLog ON DATABASE
FOR CREATE_TABLE, CREATE_PROCEDURE, CREATE_TRIGGER, ALTER_TABLE,
ALTER_PROCEDURE, ALTER_TRIGGER, DROP_TABLE, DROP_PROCEDURE,
DROP_TRIGGER
AS
INSERT INTO dbo.DatabaseLog
( ID ,
DatabaseName ,
ObjectName ,
Operator ,
OperateTime ,
OperateType ,
CommandText
)
SELECT NEWID() ,
DB_NAME() ,
EVENTDATA().value('(/EVENT_INSTANCE/ObjectName)[1]',
'sysname') ,
SYSTEM_USER ,
GETDATE() ,
EVENTDATA().value('(/EVENT_INSTANCE/EventType)[1]',
'nvarchar(100)') ,
EVENTDATA().value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]',
'nvarchar(max)');
GO
效果:当数据库中增加、修改、删除数据表、存储过程、触发器时,会往dbo.DatabaseLog表中记录一条操作信息;
注意:EVENTDATA()是系统方法,返回当前有关服务器或数据库事件的信息,返回类型为xml.
2.基于指定数据表的触发器
SQL语句:
CREATE TRIGGER [dbo].[printInsertOrderName] ON [dbo].[Material_SO_PipeOrder]
AFTER UPDATE
AS
DECLARE @insertValue NVARCHAR(50);
DECLARE @deleteValue NVARCHAR(50);
SET @deleteValue = ( SELECT TOP 1
Deleted.OrderName
FROM Deleted
);
SET @insertValue = ( SELECT TOP 1
Inserted.OrderName
FROM Inserted
);
PRINT ( '修改前=' + @deleteValue + ';修改后=' + @insertValue );
GO
效果:dbo.Material_SO_PipeOrder数据表修改数据时,会打印出修改前的OrderName和修改之后的OrderName;
几个注意点:
(1).Inserted、Deleted都是表结构,记录了当前正在执行的操作中插入的数据和删除的数据。对于Update操作,没有对应的表记录,但可以从Deleted和Inserted中分别获取修改前和修改后的数据。
(2).FOR、AFTER、INSTEAD OF的区别
FOR跟AFTER一样,在Insert/delete/update操作之后(或同时)触发一些操作;
INSTEAD OF(根据书面意思,即替换)会替换当前的操作,不会执行Insert/delete/update操作,只执行触发器定义的操作