zoukankan      html  css  js  c++  java
  • Sql Server2005 TransactSQL 新兵器学习总结之DDL触发器

    原文出处:http://www.cnblogs.com/aierong/archive/2008/09/02/1281488.html

    1.简介:
    Sql Server2005新增加了DDL触发器。
    与DML触发器不同的是,它们不会为响应针对表或视图的UPDATE、INSERT或DELETE语句而激发。
    相反,它们将为了响应各种数据定义语言(DDL)事件而激发。
    这些事件主要与以关键字CREATE、ALTER和DROP开头的Transact-SQL语句对应。
    执行DDL式操作的系统存储过程也可以激发DDL触发器。


    2.作用:
    如果要执行以下操作,可以使用DDL触发器:
    (1)要防止对数据库架构进行某些更改。
    (2)希望数据库中发生某种情况以响应数据库架构中的更改。
    (3)要记录数据库架构中的更改或事件。


    3.DDL 触发器作用域:
    (1)数据库范围:数据库范围内的DDL触发器都作为对象存储在创建它们的数据库中。
    (2)服务器范围:服务器范围内的DDL触发器作为对象存储在master数据库中。
    例如:当数据库中发生CREATE TABLE事件时,都会触发为响应CREATE TABLE事件创建的数据库范围DDL触发器。
    每当服务器上发生CREATE Index事件时,都会触发为响应CREATE Index事件创建的服务器范围DDL触发器。


    4.与DML触发器比较不同处:
    (1)DML触发器在INSERT、UPDATE和DELETE语句上操作。
    (2)DDL触发器在CREATE、ALTER、DROP和其他DDL语句上操作。
    (3)只有在完成Transact-SQL语句后才运行DDL触发器。DDL 触发器无法作为 INSTEAD OF 触发器使用。
    (4)DDL触发器不会创建插入(inserted)的和删除(deleted)的表.但是可以使用EVENTDATA函数捕获有关信息。


    5.例题:



    --例题1
    --
    服务器范围的DDL触发器
    IF EXISTS ( SELECT  *
                
    FROM    sys.server_triggers
                
    WHERE   name = 'TR_CREATEDATABASE' ) 
        
    DROP TRIGGER TR_CREATEDATABASE ON ALL SERVER ;
    GO

    CREATE TRIGGER TR_CREATEDATABASE
    ON ALL SERVER 
    FOR CREATE_DATABASE 
    AS 
        
    PRINT 'Database Created'
        
    PRINT CONVERT (nvarchar (1000),EventData())
    GO

    --创建数据库db1
    CREATE DATABASE db1;


    --收到下列消息
    Database Created
    <EVENT_INSTANCE><EventType>CREATE_DATABASE</EventType><PostTime>2008-09-01T20:17:35.170</PostTime><SPID>52</SPID><ServerName>YANFA0</ServerName><LoginName>YANFA0\Administrator</LoginName><DatabaseName>db1</DatabaseName><TSQLCommand><SetOptions ANSI_NULLS="ON" ANSI_NULL_DEFAULT="ON" ANSI_PADDING="ON" QUOTED_IDENTIFIER="ON" ENCRYPTED="FALSE"/><CommandText>CREATE DATABASE db1;</CommandText></TSQLCommand></EVENT_INSTANCE>


    --例题2
    --
    服务器范围的DDL触发器
    IF EXISTS ( SELECT  *
                
    FROM    sys.triggers
                
    WHERE   name = N'TR_DROPINDEX'
                        
    AND parent_class = 0 ) 
        
    DROP TRIGGER [TR_DROPINDEX] ON DATABASE
    GO

    CREATE TRIGGER TR_DROPINDEX
    ON DATABASE 
    FOR DROP_INDEX
    AS
        
    PRINT 'DROP INDEX'
        
    ROLLBACK
    GO

    --建立表
    CREATE TABLE TableTest ( ids INT, i NVARCHAR(100) )
    GO
    --建立唯一索引
    CREATE UNIQUE INDEX  index_TableTest 
    ON TableTest ( ids )
    GO
    --删除索引
    DROP INDEX index_TableTest
    ON TableTest
    GO



    --收到下列消息
    --我们从消息可以看到删除索引不成功!
    DROP INDEX
    消息 3609,级别 16,状态 2,第 2 行
    事务在触发器中结束。批处理已中止。



    --例题3
    --
    当不再需要某个DDL触发器时,可以禁用或删除该触发器。 
    --
    禁用DDL触发器不会将其删除。该触发器仍然作为对象存在于当前数据库中。
    --
    但是,当运行编写触发器程序所用的任何DDL语句时,不会激发触发器。
    --
    可以重新启用禁用的DDL触发器。
    DISABLE TRIGGER [TR_DROPINDEX] ON DATABASE
    GO
    ENABLE 
    TRIGGER [TR_DROPINDEX] ON DATABASE
    GO

    仅此而已
  • 相关阅读:
    D. Babaei and Birthday Cake--- Codeforces Round #343 (Div. 2)
    Vijos P1389婚礼上的小杉
    AIM Tech Round (Div. 2) C. Graph and String
    HDU 5627Clarke and MST
    bzoj 3332 旧试题
    codeforces 842C Ilya And The Tree
    codesforces 671D Roads in Yusland
    Travelling
    codeforces 606C Sorting Railway Cars
    codeforces 651C Watchmen
  • 原文地址:https://www.cnblogs.com/yuananyun/p/1882737.html
Copyright © 2011-2022 走看看