博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SQL Server DDL触发器
阅读量:5961 次
发布时间:2019-06-19

本文共 5614 字,大约阅读时间需要 18 分钟。

DDL 触发器作用:

DDL 触发器主要用于防止对数据库架构、视图、表、存储过程等进行的某些修改。

 

DDL 触发器事件:

DDL 触发器在创建用来监视并响应该数据库或服务器实例中的活动的事件通知时,可以指定相应事件类型或事件组。

超链接: 和

 

DDL 触发器类别:

DDL 触发器分为:数据库(DataBase)级别和服务器(Server)级别

 

DDL 数据库(DataBase)级别触发器:

因为 DDL 触发器不在架构范围内,所以不会在 sys.objects 目录视图中出现,无法使用 OBJECT_ID 函数来查询数据库中是否存在 DDL 触发器。

可以使用相应的目录视图来查询架构范围以外的对象。

对于 DDL 数据库级别触发器,可使用 sys.triggers 视图。对于 DDL 服务器级别触发器,可使用 sys.server_triggers 视图。

创建一个修改和删除表(table)的 DDL 数据库级别触发器:

-- 判断名为 trigger_DDL_Table 的数据库级别的触发器是否存在if exists(select * from sys.triggers where parent_class=0 and name='trigger_DDL_Table')drop trigger trigger_DDL_Table on database        --删除名为 trigger_DDL_Table 的数据库级别的触发器gocreate trigger trigger_DDL_Table    -- 创建触发器on databasefor drop_table,alter_table        -- 指定触发器事件as        print '触发器 trigger_DDL_Table 已禁止对表进行DDL的 drop、alter 操作'    rollback    --对操作进行回滚godrop table Student_backalter table Student_back add cc int null default(1)

创建一个在工作时间不允许创建、修改和删除视图(view)的 DDL 数据库级别触发器:

-- 判断名为 trigger_DDL_View 的数据库级别的触发器是否存在if exists(select * from sys.triggers where parent_class=0 and name='trigger_DDL_View')drop trigger trigger_DDL_View on database        --删除名为 trigger_DDL_View 的数据库级别的触发器gocreate trigger trigger_DDL_View    -- 创建触发器on databasefor create_view,drop_view,alter_view        -- 指定触发器事件as    if(DATEPART(hour,getdate()) between 9 and 17)    begin        declare @EventData xml        set @EventData=EVENTDATA();        select '触发器 trigger_DDL_View 已禁止工作时间对视图进行DDL的 create、drop、alter 操作'        select @EventData.value('(/EVENT_INSTANCE/EventType)[1]','nvarchar(max)') as EventType,    --事件类型               @EventData.value('(/EVENT_INSTANCE/PostTime)[1]','nvarchar(max)') as PostTime,    --事件触发的时间               @EventData.value('(/EVENT_INSTANCE/DatabaseName)[1]','nvarchar(max)') as DatabaseName,    --数据库名               @EventData.value('(/EVENT_INSTANCE/ObjectName)[1]','nvarchar(max)') as ObjectName,    --操作的对象名称               @EventData.value('(/EVENT_INSTANCE/ObjectType)[1]','nvarchar(max)') as ObjectType,    --操作的对象类型               @EventData.value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]','nvarchar(max)') as CommandText    --操作命令文本        rollback    --对操作进行回滚,也可以不回滚    endgodrop view v_Stu_Cou        -- 删除视图

启用和禁用数据库级别触发器:

-- 启用名为 trigger_DDL_View 的数据库级别触发器  enable trigger trigger_DDL_View on database;-- 禁用名为 trigger_DDL_View 的数据库级别触发器 disable trigger trigger_DDL_View on database;

查看数据库级别的触发器及事件:

--数据库级别触发器视图select * from sys.triggers--数据库级别触发器事件视图select * from sys.trigger_events--查看数据库级别的触发器及事件  select a.name,a.parent_class_desc,b.type_desc  from sys.triggers a inner join sys.trigger_events b  on a.object_id=b.object_id

EVENTDATA( ) 函数:可以在触发器内部(即 create 的 T-SQL 中)使用,当事件触发时,该函数返回一个 XML 数据类型,其中包含触发器的事件信息。

-- 当触发器执行时,该函数会返回触发器的事件信息。 select EVENTDATA();

当返回 XML 类型的结果,可以点击进行查看:

1 
2
DROP_VIEW
  -- 事件类型 3
2017-04-23T16:29:58.130
-- 事件执行时间 4
52
   5
DESKTOP-LQUB0OA
  -- 计算机名称 6
sa
  -- 登陆用户名 7
dbo
  -- 用户(即所有者) 8
Test
  -- 数据库名 9
dbo
  -- 所有者10
v_Stu_Cou
  -- 对象名11
VIEW
  --对象类型12
  -- T-SQL 命令13
14
drop view v_Stu_Cou -- 删除视图
  -- 命令文本15
16

更多关于 EVENTDATA() 函数请参考:

https://docs.microsoft.com/en-us/sql/t-sql/functions/eventdata-transact-sql

 

DDL 服务器(Server)级别触发器:

创建一个创建、修改、删除数据库的服务器级别触发器:

-- 判断名为 trigger_DDL_DB 的服务器级别的触发器是否存在,注意这里使用的是 sys.server_triggers 这个视图if exists(select * from sys.server_triggers where name='trigger_DDL_DB')drop trigger trigger_DDL_DB on all server        --删除名为 trigger_DDL_DB 的服务器级别的触发器gocreate trigger trigger_DDL_DB    -- 创建触发器on all serverfor create_database,drop_database,alter_database        -- 指定触发器事件as    declare @EventData xml    set @EventData=EVENTDATA();    -- 当触发器执行时,该函数会返回触发器的事件信息。    select EVENTDATA();    select '触发器 trigger_DDL_DB 已禁止创建、修改、删除数据库操作'    select @EventData.value('(/EVENT_INSTANCE/EventType)[1]','nvarchar(max)') as EventType,    --事件类型            @EventData.value('(/EVENT_INSTANCE/PostTime)[1]','nvarchar(max)') as PostTime,    --事件触发的时间            @EventData.value('(/EVENT_INSTANCE/ServerName)[1]','nvarchar(max)') as ServerName,    --计算机名            @EventData.value('(/EVENT_INSTANCE/DatabaseName)[1]','nvarchar(max)') as DatabaseName,    --数据库名            @EventData.value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]','nvarchar(max)') as CommandText    --操作命令文本    rollback    --对操作进行回滚,也可以不回滚gocreate database Demo        -- 创建数据库    on primary     (           name = N'DemoDB_Data',           filename = N'D:\DemoDB_Data.mdf',           size = 5mb,           maxsize = unlimited,        filegrowth = 5%       )    log on     (         name=N'DemoDB_log',                 filename=N'D:\DemoDB_log.ldf',            size = 2mb,                    maxsize = unlimited,                 filegrowth = 1%             )

启用和禁用服务器级别触发器:

-- 启用名为 trigger_DDL_DB 的服务器级别触发器  enable trigger trigger_DDL_DB on all server;-- 禁用名为 trigger_DDL_DB 的服务器级别触发器 disable trigger trigger_DDL_DB on all server;

查看服务器级别触发器及事件:

--服务器级别的触发器视图select * from sys.server_triggers--服务器级别的触发器事件视图select * from sys.server_trigger_events--查看服务器级别的触发器及事件  select a.name,a.parent_class_desc,b.type_desc  from sys.server_triggers a inner join sys.server_trigger_events b  on a.object_id=b.object_id

 

参考:

http://www.cnblogs.com/qanholas/archive/2012/05/10/2494643.html

https://msdn.microsoft.com/zh-cn/library/ms190989(v=sql.100).aspx

 

转载于:https://www.cnblogs.com/Brambling/p/6753214.html

你可能感兴趣的文章
ORA-01045: user ICCS lacks CREATE SESSION privilege; logon denied
查看>>
Android官方开发文档Training系列课程中文版:手势处理之监测通用手势
查看>>
python 网络编程
查看>>
vCenter的安装与部署
查看>>
线程间互斥:mutex
查看>>
我眼中的绩效考核“业务提成”
查看>>
明略数据吴明辉:AI商业化的核心是让用户合理接受机器的错误
查看>>
自定义View实例(二)----一步一步教你实现QQ健康界面
查看>>
Frame-relay 综合实验-4
查看>>
这个算法告诉你点链接会泄露多少秘密,帮你判断该不该点
查看>>
Gradle2.0用户指南翻译——第五章. 疑难解答
查看>>
make[1]: *** [/usr/local/pcre//Makefile] Error 127
查看>>
数据库内核月报 - 2017年12月
查看>>
killws 利用xfire部署webservice (xfire1.6+spring1.6+maven 进化版)
查看>>
【ZooKeeper Notes 27】ZooKeeper管理员指南——部署与管理ZooKeeper
查看>>
关于Exchange Server 2010中无法装入指定的数据的解决方法
查看>>
数据链路层的主要功能与服务
查看>>
Exchange server 2016 无人值守安装
查看>>
使用组策略配置Windows 7的高级防火墙
查看>>
ZoneMinder配置与使用
查看>>