我是靠谱客的博主 孝顺花生,最近开发中收集的这篇文章主要介绍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

CREATE TRIGGER safety

ON DATABASE

FOR DROP_TABLE, ALTER_TABLE

AS

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

ROLLBACK

DEMO2

CREATE TRIGGER 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

DROP TRIGGER 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 器,用于保数据中的数据表不被修改,不被

CREATE TRIGGER deny_drop_table

ON DATABASE

FOR DROP_TABLE, ALTER_TABLE

AS

PRINT 'sorryYou can not operate on the data table'

ROLLBACK

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

CREATE TRIGGER deny_drop_db

ON all server

FOR DROP_DATABASE

AS

PRINT 'sorryYou can not drop a database'

ROLLBACK;

GO

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

--1测试

CREATE TABLE logRecord_table

(

seq_num int  IDENTITY(1,1) NOT NULL, --

event_type varchar(5000) NULL, --事件

Sentence varchar(5000) NULL, --所用

oper_user varchar(50) NULL, --操作者

event_time datetime NULL, --时间

CONSTRAINT PK_logRecord_table PRIMARY KEY CLUSTERED

( seq_num  ASC )

WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]

)

ON  [PRIMARY]

GO

--2、建立DDL

CREATE TRIGGER logRecord

ON DATABASE

FOR DDL_DATABASE_LEVEL_EVENTS

AS

DECLARE @log XML

SET @log = EVENTDATA()

INSERT logRecord_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、根据之前建的触测试

drop table tb1 --除表tb1

go

drop database db1 --除数据db1

go

返回:

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

CREA TETABLE 测试(

int  IDENTITY(1,1) NOT  NULL,

测试内容 varchar(50) NOT NULL)

Drop table  测试

GO

select * from logRecord_table

GO

返回:

 

管理DDL

--DDL

CREATE TRIGGER (Transact-SQL)

--DDL

DROP TRIGGER (Transact-SQL)

--修改DDL

ALTER TRIGGER (Transact-SQL)

--重命名DDL

sp_rename(Transact-SQL)

--禁用DDL

DISABLE TRIGGER (Transact-SQL)

--启用DDL

ENABLE TRIGGER (Transact-SQL)

--DDL

DROP TRIGGER (Transact-SQL)

 

 

 


转载于:https://blog.51cto.com/57388/1630407

最后

以上就是孝顺花生为你收集整理的47. SQL- 触发器之DDL 触发器的全部内容,希望文章能够帮你解决47. SQL- 触发器之DDL 触发器所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(48)

评论列表共有 0 条评论

立即
投稿
返回
顶部