当前位置: 首页 > news >正文

MS SQL Server:DDL 触发器....

MS SQL ServerDDL 触发器

DDL 触发器 (本文转摘于网络)

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

DDL_DATABASE_LEVEL_EVENTS
包括:
DDL_TRIGGER_EVENTS,
DDL_FUNCTION_EVENTS,
DDL_SYNONYM_EVENTS,
DDL_SSB_EVENTS,
DDL_DATABASE_SECURITY_EVENTS,
DDL_EVENT_NOTIFICATION_EVENTS,
DDL_PROCEDURE_EVENTS,
DDL_TABLE_VIEW_EVENTS,
DDL_TYPE_EVENTS,
DDL_XML_SCHEMA_COLLECTION_EVENTS,
DDL_PARTITION_EVENTS,
DDL_ASSEMBLY_EVENTS

DDL_SERVER_LEVEL_EVENTS
包括:

DDL_DATABASE_EVENTS,
DROP_DATABASE,
DDL_ENDPOINT_EVENTS,
CREATE_DATABASE,
DDL_SERVER_SECURITY_EVENTS,
ALTER_DATABASE


2. DDL Trigger
语法

-- Trigger on a CREATE, ALTER, DROP, GRANT, DENY, REVOKE, or UPDATE
-- STATISTICS statement (DDL Trigger)
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 [url=URL]NAME[/url] < method specifier >[ ; ] }

<ddl_trigger_option> ::=
[ ENCRYPTION ]
[ EXECUTE AS Clause ]

<method_specifier> ::=
assembly_name.class_name.method_name



-- Trigger on a LOGON event (
Logon Trigger)
CREATE TRIGGER trigger_name
ON ALL SERVER
[ WITH <logon_trigger_option> [ ,...n ] ]
{ FOR | AFTER } LOGON
AS { sql_statement[ ; ] [ ,...n ] | EXTERNAL NAME <method specifier>[ ; ] }
<logon_trigger_option> ::=
[ ENCRYPTION ]
[ EXECUTE AS Clause ]

<method_specifier> ::=
assembly_name.class_name.method_name



3.
删除DDL trigger
系统中删除DDL触发器不能像删除其他对象那样可以简单的通过 DROP object_type object_name 来实现。对于 DDL 触发器,需要在触发器的作用钱使用一个前缀。

语法:
DROP TRIGGER trigger_name ON { DATABASE | ALL SERVER}


4. EVENTDATA( )
函数
当事件触发时,尽管这里没有 INSERTED DELETED 表提供检查什么被改变了,但可以使用名为 EVENTDATA( ) 的函数。该函数返回一个 XML 数据类型,其中包含触发器的事件信息。XML数据的基本语法如下,不过,根据被触发的时间不同,函数中的内容也会有所不同。
<SQLInstance>
<PostTime>dat
e-time</PostTime>
<SPID>spid</SPID>
<ComputerName>name</ComputerName>
</SQLInstance>


数据库级别事件具有下面的基本语法,这同以前显示的语法基本语法不同:
<SQLInstance>
<PostTime>date-
time</PostTime>
<SPID>spid</SPID>
<ComputerName>name</ComputerName>
<DatabasesName>name</DatabasesName>
<UserName>name</UserName>
<LoginName>name</LoginName>
</SQLInstance>


XML
元素 描述如下:
PostTime
:事件触发的日期和时间Ø
Ø SPID:指派到导致触发器被触发的代码上的SQLServer进程ID
ComputerName:
导致事件被触发的计算机名称Ø
Ø DatabasesName:导致事件被触发的数据库名称
UserName:
导致事件被触发的用户名称Ø
Ø LoginName: 导致事件被触发的用户登录名

实例:如果是工作时间,则不允许修改任何存储过程,否则回滚
DROP TRIGGER TEST_DDL_TRIGGER ON DATABASE
GO
CREATE TRIGGER TEST_DDL_TRIGGER
ON DATABASE
FOR CREATE_PROCEDURE, ALTER_PROCEDURE, DROP_PROCEDURE
AS
IF DATEPART(
hour, GETDATE()) >=9 AND DATEPART(hour, GETDATE()) <= 17
BEGIN
DECLARE @Message nvarchar(max)
SELECT @Message =
'Completing work during core hours. Trying to release -'
+ EVENTDATA().value(
'(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]',
'nvarchar(max)')

RAISERROR(@Message, 16, 1)
ROLLBACK
END
GO


2:创建一个数据库中发生任何行为时都被触发的触发器:
DROP TRIGGER TEST_DDL_TRIGGER_3 ON DATABASE
GO
CREATE TRIGGER TEST_DDL_TRIGGER_3
ON DATABASE
FOR DDL_DATABASE_LEVEL_EVENTS
AS
SELECT EVENTDATA()
GO

接下来创建一个存储过程,来查看返回的XML数据:
CREATE PROCEDURE TEST_TRIGGER_UTIL
AS
SELECT 'Hello all ~'
GO

返回的 XML 数据如下(经过格式化后):
<EVENT_INSTANCE>
<EventType>CREATE_PROCEDURE</EventType>
<PostTime>2008-03-31T13:53:35.397</PostTime>
<SPID>56</SPID><ServerName>ZHANGZJSQLEXPRESS</ServerName>
<LoginName>ZHANGZJDavid_Zhang</LoginName>
<UserName>dbo</UserName>
<DatabaseName>MySQLServer</DatabaseName>
<SchemaName>dbo</SchemaName>
<ObjectName>TEST_TRIGGER_UTIL</ObjectName>
<ObjectType>PROCEDURE</ObjectType>
<TSQLCommand>
<SetOptions ANSI_NULLS="ON" ANSI_NULL_DEFAULT="ON" ANSI_PADDING="ON" QUOTED_IDENTIFIER="ON" ENCRYPTED="FALSE" />
<CommandText>
CREATE PROCEDURE TEST_TRIGGER_UTIL
AS
SELECT 'Hello all ~'
</CommandText>
</TSQLCommand>
</EVENT_INSTANCE>

5.
小结
DML
触发器可以看作是一种特殊的存储过程,可以版主系统保持其完整性,在系统中进行级联更新或强行业务规则。通过 INSERTED DELETED 两个表,我们可以检索哪些列被更新了。DML触发器的本质就是当这两个表中发生数据修改时自动运行的存储过程。

DDL
触发器的构建主要是为了安全,或者根据部门的需求对系统所进行的变更进行通报。通过使用 EVENTDATA( ) 函数,可以在触发器中使用XML信息。

相关文章:

  • LeetCode-- Palindrome Number
  • Crystal Report 水晶报表如何实现类似表格单元格合并的功能
  • LeetCode-- Reverse Linked List II
  • 老牛破车般的CSDN博客
  • LeetCode- Two Sum
  • cognos8 关于密钥的问题
  • LeetCode --Word Break
  • LeetCode--H-Index
  • Leetcode--Lowest Common Ancestor of a Binary Search Tree
  • 参加Tibco的SOA应用及2009 IT架构趋势研讨会记
  • Leet 题目整理归类 - 快速通道 (持续更新)
  • 设计模式的阴谋论
  • c# mongodb driver 插入重复记录
  • 中国移动通信信息资源站实体与互联网短消息网关(ISMG)
  • MongoDB C# Driver 使用示例 (2.2)
  • 收藏网友的 源程序下载网
  • 3.7、@ResponseBody 和 @RestController
  • bootstrap创建登录注册页面
  • Docker: 容器互访的三种方式
  • GDB 调试 Mysql 实战(三)优先队列排序算法中的行记录长度统计是怎么来的(上)...
  • java8 Stream Pipelines 浅析
  • Java反射-动态类加载和重新加载
  • JDK 6和JDK 7中的substring()方法
  • React Transition Group -- Transition 组件
  • vue+element后台管理系统,从后端获取路由表,并正常渲染
  • vue从创建到完整的饿了么(18)购物车详细信息的展示与删除
  • 从tcpdump抓包看TCP/IP协议
  • 从零开始的webpack生活-0x009:FilesLoader装载文件
  • 当SetTimeout遇到了字符串
  • 分布式事物理论与实践
  • 给Prometheus造假数据的方法
  • 基于OpenResty的Lua Web框架lor0.0.2预览版发布
  • 让你的分享飞起来——极光推出社会化分享组件
  • Salesforce和SAP Netweaver里数据库表的元数据设计
  • #pragma multi_compile #pragma shader_feature
  • #使用清华镜像源 安装/更新 指定版本tensorflow
  • $emit传递多个参数_PPC和MIPS指令集下二进制代码中函数参数个数的识别方法
  • (1)虚拟机的安装与使用,linux系统安装
  • (Forward) Music Player: From UI Proposal to Code
  • (Git) gitignore基础使用
  • (三)Pytorch快速搭建卷积神经网络模型实现手写数字识别(代码+详细注解)
  • (转)ABI是什么
  • (转)scrum常见工具列表
  • .MyFile@waifu.club.wis.mkp勒索病毒数据怎么处理|数据解密恢复
  • .NET 4.0网络开发入门之旅-- 我在“网” 中央(下)
  • .net和jar包windows服务部署
  • .NET中GET与SET的用法
  • .net中的Queue和Stack
  • .Net转前端开发-启航篇,如何定制博客园主题
  • /etc/motd and /etc/issue
  • @FeignClient 调用另一个服务的test环境,实际上却调用了另一个环境testone的接口,这其中牵扯到k8s容器外容器内的问题,注册到eureka上的是容器外的旧版本...
  • @Responsebody与@RequestBody
  • @Transaction注解失效的几种场景(附有示例代码)
  • [2544]最短路 (两种算法)(HDU)
  • [4.9福建四校联考]