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

触发器工作原理

 

 

DDL触发器

  1. 与DML 触发器不同,DDL 触发器不会为响应针对表或视图的UPDATE、INSERT或DELETE 语句而激发。
  2. 响应多种数据定义语言(DDL) 语句而激发。主要是以CREATE、ALTER和DROP 开头的语句。
  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 触发器是响应Insert、Update 或Delete语句而激活的,DDL触发器是响应Create、 Alter 或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 SERVER或DATABASE

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‘sorry,You can not operate on the data table‘

ROLLBACK

DEMO2:建立一个DDL 触发器,用于保护当前SQL Server 服务器里所有数据库不能被删除。

CREATETRIGGER deny_drop_db

ON all server

FOR DROP_DATABASE

AS

PRINT‘sorry,You 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)

时间: 2024-10-08 13:36:56

47. SQL- 触发器之DDL 触发器的相关文章

46. SQL -触发器之概述

触发器   触发器概念: 触发器是一种特殊类型的存储过程,不由用户直接调用.创建触发器时会对其进行定义,以便在对特定表或列作特定类型的数据修改时执行. 触发器总结: 触发器是与数据库和数据表相结合的特殊的存储过程,当数据表有Insert.Update.Delete操作或数据库有Create.Alter.Drop 操作的时候,可以激活触发器,并运行其中的T-SQL 语句. 在SQLServer 2008 中触发器分有DML 触发器和DDL 触发器两种. 其中DML触发器又分为After 触发器和I

SQL Server DDL 触发器(Trigger)-- 介绍

SQL Server DDL 触发器(Trigger)-- 介绍 触发器(Trigger)以往仅用在特定的对象上,如数据表.当数据维护语言(DML)的Insert.Delete.Update语法针对这些对象工作时,由系统自动调用对应的触发器,而在SQL Server 2000中增加了Instead of Trigger,通过触发器来取代原本要执行的添加.修改.删除语法,且可以设置在视图上.由于Instead of Trigger是在DML语法真的改变数据写入事务日志之前触发,因此,也称为Befo

SQL Server DDL 触发器(Trigger)-- 创建数据库级别的DDL触发器

SQL Server DDL 触发器(Trigger)-- 创建数据库级别的DDL触发器 以下针对某个数据库在创建数据表时调用触发器,并将创建该数据表的用户账户写入到Windows的Event Log中. CREATE TRIGGER reminder ON DATABASE FOR CREATE_TABLE AS DECLARE @str NVARCHAR(100) SET @str=suser_sname() + N'create a new table' RAISERROR(@str,10

SQL Server DDL 触发器(Trigger)-- 创建服务器级别的DDL触发器

SQL Server DDL 触发器(Trigger)-- 创建服务器级别的DDL触发器 若是创建服务器级别的DDL触发器,只要把先前的ON DATABASE改为ON ALL SERVER,即可跟踪服务器级别的事件,使用的原理与数据库级别的DDL触发器相似,区别只在跟踪的事件不同. CREATE TRIGGER ddl_trig_login ON ALL SERVER FOR DDL_LOGIN_EVENTS AS PRINT n'ALTER LOGIN EVENT' SELECT EVENTD

SQL Server 存储过程版本控制-DDL触发器

存储过程版本控制-DDL触发器 –参考:存储过程版本控制 http://enjoyasp.net/?p=2431 CREATE TABLE [dbo].[ChangeLog]( [LogId] [int] IDENTITY(1,1) NOT NULL, [DatabaseName] [varchar] (256) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, [EventType] [varchar](50) COLLATE SQL_Latin1_

SQL Server 数据库DML触发器 【一】

今天学习SQL Server数据库中DML触发器(DDL触发器以后有时间继续学习). 当删除一条创建有触发器的表中的内容时,触发器执行SQL语句. 1.首相先创建一张表,表名称是 [Test] , 内有三个字段,分别是 [Name], Sex, Place. 1 use inter 2 create table Test 3 ( 4 [Name] varchar(20) not null, 5 Sex varchar(20) not null, 6 Place varchar(20) not n

【PLSQL】详解SQL中的trigger(触发器)

本篇主要内容如下: 8.1 触发器类型 8.1.1 DML触发器 8.1.2 替代触发器 8.1.3 系统触发器 8.2 创建触发器 8.2.1 触发器触发次序 8.2.2 创建DML触发器 8.2.3 创建替代(INSTEAD OF)触发器 8.2.3 创建系统事件触发器 8.2.4 系统触发器事件属性 8.2.5 使用触发器谓词 8.2.6 重新编译触发器 8.3 删除和使能触发器 8.4 触发器和数据字典 8.5   数据库触发器的应用举例 触发器是许多关系数据库系统都提供的一项技术.在O

48. SQL- 触发器之DML 触发器(1)

触发器   触发器分类 在SQLServer 中,触发器可以分为两大类:DML 触发器和DDL 触发器 DML 触发器: DML触发器是当数据库服务器中发生数据操作语言(Data Manipulation Language)事件时执行的存储过程. DML 触发器又分为两类:After 触发器和Instead Of 触发器 ○1 .After 触发器:这类触发器是在记录已经改变完之后(after),才会被激活执行,它主要是用于记录变更后的处理或检查,一旦发现错误,也可以用RollbackTrans

Oracle之PL/SQL学习笔记之触发器

Oracle之PL/SQL学习笔记之触发器 触发器是许多关系数据库系统都提供的一项技术.在ORACLE系统里,触发器类似过程和函数,都有声明,执行和异常处理过程的PL/SQL块. 触发器在数据库里以独立的对象存储,它与存储过程和函数不同的是,存储过程与函数需要用户显示调用才执行,而触发器是由一个事件来启动运行. 即触发器是当某个事件发生时自动地隐式运行.并且,触发器不能接收参数.所以运行触发器就叫触发或点火(firing).ORACLE事件指的是对数据库的表进行的INSERT. UPDATE及D