47. SQL- 触发器之DDL 触发器

器工作原理

 

 

DDL

  1. DML 器不同,DDL 器不会应针对表或视图UPDATEINSERTDELETE 句而激

  2. 多种数据定义语(DDL) 句而激。主要是以CREATEALTERDROP 句。

  3. DDL 器可用于管理任,例如核和控制数据操作。

  4. DDL 器的作用域:

l 数据作用域

l 器作用域

在响当前数据或服器中理的Transact-SQL 事件,将激DDL 器。触器的作用域取决于事件(数据作用域事件和服器作用域事件)。每个事件都对应一个Transact-SQL 句,经过修改,在关字之包含了下划线(―_‖)

  1. DDL 器作用:

  • 防止数据架构行某些更改。

  • 数据生某种情况以响数据架构中的更改。

  • 记录数据架构中的更改或事件。

  • 在运行触DDL器的DDL 句后,DDL 器才会激

  • DDL 器无法作INSTEADOF 器使用。

DEMO1

CREATETRIGGER safety

ONDATABASE

FOR DROP_TABLE, ALTER_TABLE

AS

PRINT‘You must disable Trigger "safety" to drop or altertables!‘

ROLLBACK

DEMO2

CREATETRIGGER ddl_trig_login

ON ALL SERVER FOR DDL_LOGIN_EVENTS

AS

PRINT‘Login Event Issued.‘

SELECT

EVENTDATA().value(‘(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]‘,‘nvarchar(max)‘)

GO

DROPTRIGGER ddl_trig_login

ON ALL SERVER

GO

 

 

DDL

  1. DDL 器是SQL Server2005 新增的一个触型,是一种特殊的触器,它在数据定义语言(DDL。一般用于数据行管理任

  2. DML器一DDL 器也是通事件来激活,并行其中SQL 句的。

  3. 但与DML器不同,DML 器是响InsertUpdate Delete句而激活的,DDL器是响CreateAlter Drop句而激活的。

  4. 一般来,在以下几种情况下可以使用DDL器:

数据里的架构或数据表架构很重要,不允被修改。

防止数据或数据表被操作除。

在修改某个数据表构的同修改另一个数据表的相构。

记录对数据库结构操作的事件。

 

DDL

法:

CREATETRIGGER trigger_name

ON { ALL SERVER | DATABASE }

[WITH <ddl_trigger_option> [ ,...n ] ]

{ FOR | AFTER} { event_type | event_group } [ ,...n ]

AS { sql_statement [ ; ] [ ...n ] | EXTERNAL NAME < methodspecifier > [; ] }

成中文

CREATETRIGGER 器名

ON ALL SERVERDATABASE

FOR AFTER 激活DDL器的事件

AS 行的SQL

参数:

ON 后面的AllServer 是将DDL 器作用到整个当前的服器上。如果指定了个参数,在当前服器上的任何一个数据都能激活器。

ON 后面的Database是将DDL 器作用到当前数据,只能在个数据上激器。

For After是同一个意思,指定的是After 器,DDL 器不能指定的Stead Of 器。

激活DDL 器的事件包括两种,

DDL 器作用在当前数据情况下可以使用以下事件:

CREATE_APPLICATION_ROLEALTER_APPLICATION_ROLE DROP_APPLICATION_ROLE

CREATE_ASSEMBLYALTER_ASSEMBLY DROP_ASSEMBLY

ALTER_AUTHORIZATION_DATABASE

CREATE_CERTIFICATEALTER_CERTIFICATE DROP_CERTIFICATE

CREATE_CONTRACTDROP_CONTRACT

GRANT_DATABASEDENY_DATABASE REVOKE_DATABASE

CREATE_EVENT_NOTIFICATIONDROP_EVENT_NOTIFICATION

CREATE_FUNCTIONALTER_FUNCTION DROP_FUNCTION

CREATE_INDEXALTER_INDEX DROP_INDEX

CREATE_MESSAGE_TYPEALTER_MESSAGE_TYPE DROP_MESSAGE_TYPE

CREATE_PARTITION_FUNCTIONALTER_PARTITION_FUNCTION DROP_PARTITION_FUNCTION

CREATE_PARTITION_SCHEMEALTER_PARTITION_SCHEME DROP_PARTITION_SCHEME

CREATE_PROCEDUREALTER_PROCEDURE DROP_PROCEDURE

CREATE_QUEUEALTER_QUEUE DROP_QUEUE

CREATE_REMOTE_SERVICE_BINDINGALTER_REMOTE_SERVICE_BINDING DROP_REMOTE_SERVICE_BINDING

CREATE_ROLEALTER_ROLE DROP_ROLE

CREATE_ROUTEALTER_ROUTE DROP_ROUTE

CREATE_SCHEMAALTER_SCHEMA DROP_SCHEMA

CREATE_SERVICEALTER_SERVICE DROP_SERVICE

CREATE_STATISTICSDROP_STATISTICS UPDATE_STATISTICS

CREATE_SYNONYMDROP_SYNONYM CREATE_TABLE

ALTER_TABLEDROP_TABLE

CREATE_TRIGGERALTER_TRIGGER DROP_TRIGGER

CREATE_TYPEDROP_TYPE

CREATE_USERALTER_USER DROP_USER

CREATE_VIEWALTER_VIEW DROP_VIEW

CREATE_XML_SCHEMA_COLLECTIONALTER_XML_SCHEMA_COLLECTION DROP_XML_SCHEMA_COLLECTION

 

DDL 器作用在当前服器情况下,可以使用以下事件:

ALTER_AUTHORIZATION_SERVER

CREATE_DATABASEALTER_DATABASE DROP_DATABASE

CREATE_ENDPOINTDROP_ENDPOINT

CREATE_LOGINALTER_LOGIN DROP_LOGIN

GRANT_SERVERDENY_SERVER REVOKE_SERVER

DEMO1:建立一个DDL 器,用于保数据中的数据表不被修改,不被

CREATETRIGGER deny_drop_table

ONDATABASE

FOR DROP_TABLE, ALTER_TABLE

AS

PRINT‘sorryYou can not operate on the data table‘

ROLLBACK

DEMO2:建立一个DDL 器,用于保当前SQL Server 器里所有数据不能被除。

CREATETRIGGER deny_drop_db

ON all server

FOR DROP_DATABASE

AS

PRINT‘sorryYou can not drop a database‘

ROLLBACK;

GO

DEMO3建一个数据操作记录表,用于记录当数据库发生操作的操作事件

--1测试

CREATETABLE logRecord_table

(

seq_numint IDENTITY(1,1) NOT NULL, --

event_typevarchar(5000) NULL, --事件

Sentencevarchar(5000) NULL, --所用

oper_uservarchar(50) NULL, --操作者

event_timedatetime NULL, --时间

CONSTRAINTPK_logRecord_table PRIMARY KEYCLUSTERED

( seq_num ASC )

WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]

)

ON [PRIMARY]

GO

--2、建立DDL

CREATETRIGGER logRecord

ONDATABASE

FOR DDL_DATABASE_LEVEL_EVENTS

AS

DECLARE@log XML

SET @log = EVENTDATA()

INSERTlogRecord_table

(event_type, Sentence,oper_user, event_time)

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 点的点的位置是括号里的第一个参数。

--3、根据之前建的触测试

droptable tb1 --除表tb1

go

dropdatabase db1 --除数据db1

go

返回:

-- 建一个测试表,然后测试表,看日志记录表情况,需先除或禁用deny_drop_table

CREATETABLE 测试(

int IDENTITY(1,1) NOT NULL,

测试内容varchar(50) NOTNULL)

Droptable 测试

GO

select* from logRecord_table

GO

返回:

 

管理DDL

--DDL

CREATETRIGGER (Transact-SQL)

--DDL

DROPTRIGGER (Transact-SQL)

--修改DDL

ALTERTRIGGER (Transact-SQL)

--重命名DDL

sp_rename(Transact-SQL)

--禁用DDL

DISABLETRIGGER (Transact-SQL)

--启用DDL

ENABLETRIGGER (Transact-SQL)

--DDL

DROPTRIGGER (Transact-SQL)

 

 

 


本文出自 “Ricky's Blog” 博客,请务必保留此出处http://57388.blog.51cto.com/47388/1630407

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。