`
wsql
  • 浏览: 11758394 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

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信息。

分享到:
评论

相关推荐

    浅析SQL Server2005中的DDL触发器技术.pdf

    浅析SQL Server2005中的DDL触发器技术.pdf

    sql 触发器 详解与实例

    触发器对表进行插入、更新、删除的时候会自动执行的特殊...SQL Server 2005中触发器可以分为两类:DML触发器和DDL触发器,其中DDL触发器它们会影响多种数据定义语言语句而激发,这些语句有create、alter、drop语句。

    Oracle从入门到精通

    一、SQL................................................... 1.1、基本概念:........................................... 1.2、数据库安全:......................................... 1.3、基本的SQL SELECT ...

    sqlserver 触发器学习(实现自动编号)

    总结常用基本点如下: 1、触发器有两种类型:数据定义语言触发器(DDL触发器)和数据操纵语言触发器(DML触发器)。 DDL触发器:在用户对数据库执行数据定义(CREATE、ALTER、DROP或相似的语句)对数据库结构进行...

    SQL Server误区30日谈 第4天 DDL触发器就是INSTEAD OF触发器

    误区 #4: DDL触发器(SQL Server 2005之后被引入)就是INSTEAD OF触发器 这是错误的  DDL触发器的实现原理其实就是一个AFTER触发器。这个意思是先发生DDL操作,然后触发器再捕捉操作(当然如果你在触发器内写了...

    SQL Server 2008中的代码安全(二) DDL触发器与登录触发器

    MicrosoftSQL Server 提供两种主要机制来强制使用业务规则和数据完整性:约束和触发器。触发器为特殊类型的存储过程,可在执行语言事件...SQL Server 包括三种常规类型的触发器:DML 触发器、DDL 触发器和登录触发器。

    python小工具-sqlserver ddl转换为mysql规范ddl

    图形化实现sqlserver转换为mysql ddl(需字段注释) 应用于数据库、新老系统迁移,提升开发效率。

    SQL SERVER 触发器介绍

    触发器是一种特殊类型的存储过程,它不同于之前的我们介绍的存储过程。...SQL Server 2005中触发器可以分为两类:DML触发器和DDL触发器,其中DDL触发器它们会影响多种数据定义语言语句而激发,这些语句有creat

    SQL语言DDL详述文档.zip

    入门数据库DDL类型语言详解

    EMS SQL Manager 2008 for SQL Server v3.2.0.2 part3

    SQL Manager 2008支持从SQL Server 7到2008的任一版本,它还支持最新版本的SQL Server的特点,包括:新的SQL Server 2008的授权系统、汇编功能、DDL触发、XML分栏显示等其他特点。它提供了大量工具以满足诸如数据库...

    深入浅析SQL Server 触发器

    触发器是一种特殊类型的存储过程,它不同于之前的我们介绍的存储过程。...SQL Server 2005中触发器可以分为两类:DML触发器和DDL触发器,其中DDL触发器它们会影响多种数据定义语言语句而激发,这些语句有cr

    EMS SQL Manager 2008 for SQL Server v3.3.0.1 part3

    SQL Manager 2008支持从SQL Server 7到2008的任一版本,它还支持最新版本的SQL Server的特点,包括:新的SQL Server 2008的授权系统、汇编功能、DDL触发、XML分栏显示等其他特点。它提供了大量工具以满足诸如数据库...

    EMS SQL Manager 2008 for SQL Server v3.2.0.2 part2

    SQL Manager 2008支持从SQL Server 7到2008的任一版本,它还支持最新版本的SQL Server的特点,包括:新的SQL Server 2008的授权系统、汇编功能、DDL触发、XML分栏显示等其他特点。它提供了大量工具以满足诸如数据库...

    SQLSever中的触发器基本语法与作用

    SQL Server 2005中触发器可以分为两类:DML触发器和DDL触发器,其中DDL触发器它们会影响多种数据定义语言语句而激发,这些语句有create、alter、drop语句。 SQL Server为每个触发器都创建了两个专用表﹕Insert

    SQL Server触发器及触发器中的事务学习

    如果你有对触发器和事务的概念,有些了解,这篇文章,对你来说会是很简单,或能让你更进一步的了解触发器里面的一些故事,和... 在下面的内容,用到一些SQL Server 触发器和事务的一些术语,如果有些不明白的地方,

    第9章 触发器.ppt

    重点之中点 9.1 触发器的种类和触发事件 9.2 DML触发器 9.3 数据库事件触发器 9.4 DDL事件触发器 9.5 替代触发器 9.6 查看触发器

    了解SQLServer触发器及触发器中的事务

    在这边文章里面,我不会从触发器和事务的概念去讲述,而是从常见的两种触发器类型(DML触发器&DDL触发器)和After触发器&InsteadOf触发器的应用不同,开始说起它们,然后是说与事务有关的故事。如果,你有什么建议和...

    第4课+MaxCompute+DDL操作.docx

    第4课+MaxCompute+DDL操作.docx第4课+MaxCompute+DDL操作.docx第4课+MaxCompute+DDL操作.docx第4课+MaxCompute+DDL操作.docx第4课+MaxCompute+DDL操作.docx第4课+MaxCompute+DDL操作.docx第4课+MaxCompute+DDL操作....

Global site tag (gtag.js) - Google Analytics