只要注意到DDL触发器和DML触发器的区别,设计DDL触发器与设计DML触发器也很类似,下面详细讲述一下要怎么去设计一个DDL触发器。
    建立DDL触发器的语句
建立DDL触发器的语法代码如下:
CREATE TRIGGER trigger_name
ON { ALL SERVER | DATABASE }
[ WITH <ddl_trigger_option> [ ,...n ] ]
{ FOR | AFTER } { event_type | event_group } [ ,...n ]
AS { sql_statement  [ ; ] [ ...n ] | EXTERNAL NAME < method specifier >  [ ; ] }
用中文取代一下英文可以看得更明白:
CREATE TRIGGER 触发器名
ON  ALL SERVER或DATABASE
FOR 或AFTER
激活DDL触发器的事件
请在此输入内容...
AS
        要执行的SQL语句
其中:
l  ON后面的All Server是将DDL触发器作用到整个当前的服务器上。如果指定了这个参数,在当前服务器上的任何一个数据库都能激活该触发器。
l  ON后面的Database是将DDL触发器作用到当前数据库,只能在这个数据库上激活该触发器。
l  For或After是同一个意思,指定的是After触发器,DDL触发器不能指定的Stead Of触发器。
l  激活DDL触发器的事件包括两种,在DDL触发器作用在当前数据库情况下可以使用以下事件:
CREATE_APPLICATION_ROLE
ALTER_APPLICATION_ROLE
DROP_APPLICATION_ROLE
CREATE_ASSEMBLY
ALTER_ASSEMBLY
DROP_ASSEMBLY
ALTER_AUTHORIZATION
_DATABASE
CREATE_CERTIFICATE
ALTER_CERTIFICATE
DROP_CERTIFICATE
CREATE_CONTRACT
DROP_CONTRACT
GRANT_DATABASE
DENY_DATABASE
REVOKE_DATABASE
CREATE_EVENT_NOTIFICATION
DROP_EVENT_NOTIFICATION
CREATE_FUNCTION
ALTER_FUNCTION
DROP_FUNCTION
CREATE_INDEX
ALTER_INDEX
DROP_INDEX
CREATE_MESSAGE_TYPE
ALTER_MESSAGE_TYPE
DROP_MESSAGE_TYPE
CREATE_PARTITION_FUNCTION
ALTER_PARTITION_FUNCTION
DROP_PARTITION_FUNCTION
CREATE_PARTITION_SCHEME
ALTER_PARTITION_SCHEME
DROP_PARTITION_SCHEME
CREATE_PROCEDURE
ALTER_PROCEDURE
DROP_PROCEDURE
CREATE_QUEUE
ALTER_QUEUE
DROP_QUEUE
CREATE_REMOTE_SERVICE
_BINDING
ALTER_REMOTE_SERVICE
_BINDING
DROP_REMOTE_SERVICE
_BINDING
CREATE_ROLE
ALTER_ROLE
DROP_ROLE
CREATE_ROUTE
ALTER_ROUTE
DROP_ROUTE
CREATE_SCHEMA
ALTER_SCHEMA
DROP_SCHEMA
CREATE_SERVICE
ALTER_SERVICE
DROP_SERVICE
CREATE_STATISTICS
DROP_STATISTICS
UPDATE_STATISTICS
CREATE_SYNONYM
DROP_SYNONYM
CREATE_TABLE
ALTER_TABLE
DROP_TABLE
CREATE_TRIGGER
ALTER_TRIGGER
DROP_TRIGGER
CREATE_TYPE
DROP_TYPE
CREATE_USER
ALTER_USER
DROP_USER
CREATE_VIEW
ALTER_VIEW
DROP_VIEW
CREATE_XML_SCHEMA
_COLLECTION
ALTER_XML_SCHEMA
_COLLECTION
DROP_XML_SCHEMA
_COLLECTION
在DDL触发器作用在当前服务器情况下,可以使用以下事件:
ALTER_AUTHORIZATION_SERVER
CREATE_DATABASE
ALTER_DATABASE
DROP_DATABASE
CREATE_ENDPOINT
DROP_ENDPOINT
CREATE_LOGIN
ALTER_LOGIN
DROP_LOGIN
GRANT_SERVER
DENY_SERVER
REVOKE_SERVER
例三,建立一个DDL触发器,用于保护数据库中的数据表不被修改,不被删除。具体操作步骤如下:
(1)启动Management Studio,登录到指定的服务器上。
(2)在如图11.1所示界面的【对象资源管理器】下选择【数据库】,定位到【Northwind】数据库上。
(3)单击【新建查询】按钮,在弹出的【查询编辑器】的编辑区里输入以下代码:
CREATE TRIGGER 禁止对数据表操作
ON DATABASE
FOR DROP_TABLE, ALTER_TABLE
AS
  PRINT '对不起,您不能对数据表进行操作'
  ROLLBACK ;
(4)单击【执行】按钮,生成触发器。
例四,建立一个DDL触发器,用于保护当前SQL Server服务器里所有数据库不能被删除。具体代码如下:
CREATE TRIGGER 不允许删除数据库
ON all server 
FOR DROP_DATABASE
AS
  PRINT '对不起,您不能删除数据库'
  ROLLBACK ;
GO
例五,建立一个DDL触发器,用来记录数据库修改状态。具体操作步骤如下:
(1)建立一个用于记录数据库修改状态的表:
CREATE TABLE 日志记录表(
        编号 int IDENTITY(1,1) NOT NULL,
        事件 varchar(5000) NULL,
        所用语句 varchar(5000) NULL,
        操作者 varchar(50) NULL,
        发生时间 datetime NULL,
 CONSTRAINT PK_日志记录表 PRIMARY KEY CLUSTERED
(
        编号 ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO
(2)建立DDL触发器:
CREATE TRIGGER 记录日志
ON DATABASE
FOR DDL_DATABASE_LEVEL_EVENTS
AS
DECLARE @log XML
SET @log = EVENTDATA()
INSERT  日志记录表
  (事件, 所用语句,操作者, 发生时间)
  VALUES
  (
  @log.value('(/EVENT_INSTANCE/EventType)[1]', 'nvarchar(100)'),
  @log.value('(/EVENT_INSTANCE/TSQLCommand)[1]', 'nvarchar(2000)'),
  CONVERT(nvarchar(100), CURRENT_USER),
  GETDATE()
  ) ;
GO
其中Eventdata是个数据库函数,它的作用是以XML格式返回有关服务器或数据库事件的信息。@log.value是返回log这个XML结点的值,结点的位置是括号里的第一个参数。
11.15.2  测试触发器功能
现在测试一下在上一章节中建立好的三个触发器的功能。下面所有的测试都是在【查询编辑器】对话框里进行的,要打开【查询编辑器】对话框,只要单击Management Studio里【新建查询】按钮即可。
测试例三:例三是保证【Northwind】数据库里不能删除表和修改表,在【查询编辑器】对话框里输入一个删除表的SQL语句:
Drop table 操作记录表
运行结果如图11.17所示:
请在此输入内容...
请在此输入内容...
 
图11.17 不允许删除表格
测试例四:例四是保证当前服务器里的所有数据库不能被删除,在【查询编辑器】对话框里输入一个删除数据库的SQL语句:
Drop DataBase test
运行结果如图11.18所示:
请在此输入内容...
 
图11.18 不允许删除数据库
测试例五:例五是记录对【Northwind】所进行的操作,在【查询编辑器】对话框里输入一条添加数据表和一条删除数据表的SQL语句,然后再用Select语句查看【目志记录表】数据表里所有的记录:
CREATE TABLE 测试表(
        编号int IDENTITY(1,1) NOT NULL,
        测试内容varchar(50) NOT NULL)
GO
Drop table 测试表
drop table if exists userGO
select * from 日志记录表
GO
运行时不要忘了,前面曾经建立过一个不能删除数据表的触发器,要先把它禁用或删除。运行结果如图11.19所示:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。