当前位置: 首页 > news >正文

DDL触发器学习整理

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

1.了解触发器的作用域

在响应当前数据库或服务器上处理的 Transact-SQL 事件时,可以触发 DDL 触发器。触发器的作用域取决于事件。例如,每当数据库中或服务器实例上发生 CREATE_TABLE 事件时,都会激发为响应 CREATE_TABLE 事件创建的 DDL 触发器。仅当服务器上发生 CREATE_LOGIN 事件时,才能激发为响应 CREATE_LOGIN 事件创建的 DDL 触发器。

在下面的示例中,每当数据库中发生 DROP TABLEALTER TABLE 事件时,都会激发 DDL 触发器 safety

CREATE TRIGGER safety 
ON DATABASE 
FOR DROP_TABLE, ALTER_TABLE 
AS 
   PRINT 'You must disable Trigger "safety" to drop or alter tables!' 
   ROLLBACK
;

在下面的示例中,如果当前服务器实例上发生任何 CREATE_DATABASE 事件,DDL 触发器将输出消息。此示例使用 EVENTDATA 函数检索相应的 Transact-SQL 语句的文本。有关如何将 EVENTDATA 与 DDL 触发器配合使用的详细信息,请参阅使用 EVENTDATA 函数。

IF EXISTS (SELECT * FROM sys.server_triggers
    WHERE name = 'ddl_trig_database')
DROP TRIGGER ddl_trig_database
ON ALL SERVER;
GO
CREATE TRIGGER ddl_trig_database 
ON ALL SERVER 
FOR CREATE_DATABASE 
AS 
    PRINT 'Database Created.'
    SELECT EVENTDATA().value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]','nvarchar(max)')
GO
DROP TRIGGER ddl_trig_database
ON ALL SERVER;
GO

本主题后面的“选择触发 DDL 触发器的特定 DDL 语句”一部分中提供了一些链接,通过这些链接可以找到将 Transact-SQL 语句映射到为它们指定的作用域的列表。

数据库范围内的 DDL 触发器都作为对象存储在创建它们的数据库中。可以在 master 数据库中创建 DDL 触发器,这些触发器的行为与在用户设计的数据库中创建的 DDL 触发器的行为类似。可以通过查询 sys.triggers 目录视图获取有关 DDL 触发器的信息。可以在创建触发器的数据库上下文中或通过指定数据库名称作为标识符(例如 master.sys.triggers),查询 sys.triggers

服务器范围内的 DDL 触发器作为对象存储在 master 数据库中。然而,可以通过在任何数据库上下文中查询 sys.server_triggers 目录视图,获取有关服务器范围内的 DDL 触发器的信息。

2.DDL事件

下表列出了可用于激发 DDL 触发器或事件通知的 DDL 事件。注意,每个事件都对应于一个 Transact-SQL 语句或存储过程,并且语句语法修改为在关键字之间加入了一个下划线字符 (_)。

重要提示:

执行类似 DDL 的操作的系统存储过程也可以激发 DDL 触发器和事件通知。请测试您的 DDL 触发器和事件通知以确定它们是否响应运行的系统存储过程。例如,CREATE TYPE 语句和 sp_addtype 存储过程都将激发针对 CREATE_TYPE 事件创建的 DDL 触发器或事件通知。

具有服务器或数据库作用域的 DDL 语句

可以创建 DDL 触发器或事件通知,以便在其中创建了它们的数据库发生以下事件(或服务器实例中的任何位置发生以下事件时)激发它们以做出响应。

CREATE_APPLICATION_ROLE(适用于 CREATE APPLICATION ROLE 语句和 sp_addapprole。如果创建新架构,则此事件还会触发 CREATE_SCHEMA 事件)。

ALTER_APPLICATION_ROLE(适用于 ALTER APPLICATION ROLE 语句和 sp_approlepassword)。

DROP_APPLICATION_ROLE(适用于 DROP APPLICATION ROLE 语句和 sp_dropapprole)。

CREATE_ASSEMBLY

ALTER_ASSEMBLY

DROP_ASSEMBLY

CREATE_ASYMMETRIC_KEY

ALTER_ASYMMETRIC_KEY

DROP_ASYMMETRIC_KEY

ALTER_AUTHORIZATION

ALTER_AUTHORIZATION_DATABASE(适用于 sp_changedbowner;当指定 ON DATABASE 时,还适用于 ALTER AUTHORIZATION 语句。)

CREATE_CERTIFICATE

ALTER_CERTIFICATE

DROP_CERTIFICATE

CREATE_CONTRACT

DROP_CONTRACT

ADD_COUNTER_SIGNATURE

DROP_COUNTER_SIGNATURE

CREATE_CREDENTIAL

ALTER_CREDENTIAL

DROP_CREDENTIAL

GRANT_DATABASE

DENY_DATABASE

REVOKE_DATABASE

CREATE_DEFAULT

DROP_DEFAULT

BIND_DEFAULT(适用于 sp_bindefault)。

UNBIND_DEFAULT(适用于 sp_unbindefault)。

CREATE_EVENT_NOTIFICATION

DROP_EVENT_NOTIFICATION

CREATE_EXTENDED_PROPERTY(适用于 sp_addextendedproperty)。

ALTER_EXTENDED_PROPERTY(适用于 sp_updateextendedproperty)。

DROP_EXTENDED_PROPERTY(适用于 sp_dropextendedproperty)。

CREATE_FULLTEXT_CATALOG(适用于 CREATE FULLTEXT CATALOG 语句;当指定 create 时,还适用于 sp_fulltextcatalog)。

ALTER_FULLTEXT_CATALOG(适用于 ALTER FULLTEXT CATALOG 语句;当指定 start_incrementalstart_fullStopRebuild 时,适用于 sp_fulltextcatalog;当指定 enable 时,适用于 sp_fulltext_database)。

DROP_FULLTEXT_CATALOG(适用于 DROP FULLTEXT CATALOG 语句;当指定 drop 时,还适用于 sp_fulltextcatalog)。

CREATE_FULLTEXT_INDEX(适用于 CREATE FULLTEXT INDEX 语句;当指定 create 时,还适用于 sp_fulltexttable)。

ALTER_FULLTEXT_INDEX(适用于 ALTER FULLTEXT INDEX 语句;当指定 start_fullstart_incrementalstop 时,适用于 sp_fulltextcatalog;当指定 createdrop 以外的任何其他操作时,适用于 sp_fulltext_table;此外还适用于 sp_fulltext_column)。

DROP_FULLTEXT_INDEX(适用于 DROP FULLTEXT INDEX 语句;当指定 drop 时,还适用于 sp_fulltexttable)。

CREATE_FUNCTION

ALTER_FUNCTION

DROP_FUNCTION

CREATE_INDEX

ALTER_INDEX(适用于 ALTER INDEX 语句和 sp_indexoption)。

DROP_INDEX

CREATE_MASTER_KEY

ALTER_MASTER_KEY

DROP_MASTER_KEY

CREATE_MESSAGE_TYPE

ALTER_MESSAGE_TYPE

DROP_MESSAGE_TYPE

CREATE_PARTITION_FUNCTION

ALTER_PARTITION_FUNCTION

DROP_PARTITION_FUNCTION

CREATE_PARTITION_SCHEME

ALTER_PARTITION_SCHEME

DROP_PARTITION_SCHEME

CREATE_PLAN_GUIDE(适用于 sp_create_plan_guide)。

ALTER_PLAN_GUIDE(当指定 ENABLE、ENABLE ALL、DISABLE 或 DISABLE ALL 时适用于 sp_control_plan_guide)。

DROP_PLAN_GUIDE(当指定 DROP 或 DROP ALL 时适用于 sp_control_plan_guide)。

CREATE_PROCEDURE

ALTER_PROCEDURE(适用于 ALTER PROCEDURE 语句和 sp_procoption)。

DROP_PROCEDURE

CREATE_QUEUE

ALTER_QUEUE

DROP_QUEUE

CREATE_REMOTE_SERVICE_BINDING

ALTER_REMOTE_SERVICE_BINDING

DROP_REMOTE_SERVICE_BINDING

CREATE_SPATIAL_INDEX

RENAME(适用于 sp_rename)。

CREATE_ROLE(适用于 CREATE ROLE 语句、sp_addrolesp_addgroup)。

ALTER_ROLE

DROP_ROLE(适用于 DROP ROLE 语句、sp_droprolesp_dropgroup)。

ADD_ROLE_MEMBER

DROP_ROLE_MEMBER

CREATE_ROUTE

ALTER_ROUTE

DROP_ROUTE

CREATE_RULE

DROP_RULE

BIND_RULE(适用于 sp_bindrule)。

UNBIND_RULE(适用于 sp_unbindrule)。

CREATE_SCHEMA(适用于 CREATE SCHEMA 语句、sp_addrolesp_addusersp_addgroupsp_grantdbaccess)。

ALTER_SCHEMA(适用于 ALTER SCHEMA 语句和 sp_changeobjectowner)。

DROP_SCHEMA

CREATE_SERVICE

ALTER_SERVICE

DROP_SERVICE

ALTER_SERVICE_MASTER_KEY

BACKUP_SERVICE_MASTER_KEY

RESTORE_SERVICE_MASTER_KEY

ADD_SIGNATURE

DROP_SIGNATURE

CREATE_SPATIAL_INDEX

ALTER_INDEX 可用于空间索引。

DROP_INDEX 可用于空间索引。

CREATE_STATISTICS

DROP_STATISTICS

UPDATE_STATISTICS

CREATE_SYMMETRIC_KEY

ALTER_SYMMETRIC_KEY

DROP_SYMMETRIC_KEY

CREATE_SYNONYM

DROP_SYNONYM

CREATE_TABLE

ALTER_TABLE(适用于 ALTER TABLE 语句和 sp_tableoption)。

DROP_TABLE

CREATE_TRIGGER

ALTER_TRIGGER(适用于 ALTER TRIGGER 语句和 sp_settriggerorder)。

DROP_TRIGGER

CREATE_TYPE(适用于 CREATE TYPE 语句和 sp_addtype)。

DROP_TYPE(适用于 DROP TYPE 语句和 sp_droptype)。

CREATE_USER(适用于 CREATE USER 语句、sp_addusersp_grantdbaccess)。

ALTER_USER(应用于 ALTER USER 语句和 sp_change_users_login。)

DROP_USER(适用于 DROP USER 语句、sp_dropusersp_revokedbaccess)。

CREATE_VIEW

ALTER_VIEW

DROP_VIEW

CREATE_XML_INDEX

ALTER_INDEX 可用于 XML 索引。

DROP_INDEX 可用于 XML 索引。

CREATE_XML_SCHEMA_COLLECTION

ALTER_XML_SCHEMA_COLLECTION

DROP_XML_SCHEMA_COLLECTION

具有服务器作用域的 DDL 语句

可以创建当服务器实例中的任何位置发生以下事件时被激发以响应这些事件的 DDL 触发器或事件通知。

ALTER_AUTHORIZATION_SERVER

CREATE_DATABASE

ALTER_DATABASE(适用于 ALTER DATABASE 语句和 sp_fulltext_database)。

DROP_DATABASE

CREATE_ENDPOINT

ALTER_ENDPOINT

DROP_ENDPOINT

CREATE_EXTENDED_PROCEDURE(适用于 sp_addextendedproc)。

DROP_EXTENDED_PROCEDURE(适用于 sp_dropextendedproc)。

ALTER_INSTANCE(当指定了本地服务器实例时适用于 sp_configuresp_addserver)。

CREATE_LINKED_SERVER(适用于 sp_addlinkedserver)。

ALTER_LINKED_SERVER(适用于 sp_serveroption)。

DROP_LINKED_SERVER(当指定了链接服务器时适用于 sp_dropserver)。

CREATE_LINKED_SERVER_LOGIN(适用于 sp_addlinkedsrvlogin)。

DROP_LINKED_SERVER_LOGIN(适用于 sp_droplinkedsrvlogin)。

CREATE_LOGIN(如果用于必须隐式创建的不存在的登录名,适用于 CREATE LOGIN 语句、sp_addloginsp_grantloginxp_grantloginsp_denylogin)。

ALTER_LOGIN(当指定 Auto_Fix 时,还适用于 ALTER LOGIN 语句、sp_defaultdbsp_defaultlanguagesp_passwordsp_change_users_login)。

DROP_LOGIN(适用于 DROP LOGIN 语句、sp_droploginsp_revokeloginxp_revokelogin)。

CREATE_MESSAGE(适用于 sp_addmessage)。

ALTER_MESSAGE(适用于 sp_altermessage)。

DROP_MESSAGE(适用于 sp_dropmessage)。

CREATE_REMOTE_SERVER(适用于 sp_addserver)。

ALTER_REMOTE_SERVER(适用于 sp_setnetname)。

DROP_REMOTE_SERVER(当指定了远程服务器时适用于 sp_dropserver)。

GRANT_SERVER

DENY_SERVER

REVOKE_SERVER

ADD_SERVER_ROLE_MEMBER

DROP_SERVER_ROLE_MEMBER

下图展示DDL 事件组

DDL Trigger

3.创建DDL触发器:

语法:

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 NAME < 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

参数

schema_name

DML 触发器所属架构的名称。DML 触发器的作用域是为其创建该触发器的表或视图的架构。对于 DDL 或登录触发器,无法指定 schema_name

trigger_name

触发器的名称。trigger_name 必须遵循标识符规则,但 trigger_name 不能以 # 或 ## 开头。

table | view

对其执行 DML 触发器的表或视图,有时称为触发器表或触发器视图。可以根据需要指定表或视图的完全限定名称。视图只能被 INSTEAD OF 触发器引用。不能对局部或全局临时表定义 DML 触发器。

DATABASE

将 DDL 触发器的作用域应用于当前数据库。如果指定了此参数,则只要当前数据库中出现 event_typeevent_group,就会激发该触发器。

ALL SERVER

将 DDL 或登录触发器的作用域应用于当前服务器。如果指定了此参数,则只要当前服务器中的任何位置上出现 event_typeevent_group,就会激发该触发器。

WITH ENCRYPTION

对 CREATE TRIGGER 语句的文本进行模糊处理。使用 WITH ENCRYPTION 可以防止将触发器作为 SQL Server 复制的一部分进行发布。不能为 CLR 触发器指定 WITH ENCRYPTION。

EXECUTE AS

指定用于执行该触发器的安全上下文。允许您控制 SQL Server 实例用于验证被触发器引用的任意数据库对象的权限的用户帐户。

有关详细信息,请参阅 EXECUTE AS 子句 (Transact-SQL)。

FOR | AFTER

AFTER 指定 DML 触发器仅在触发 SQL 语句中指定的所有操作都已成功执行时才被触发。所有的引用级联操作和约束检查也必须在激发此触发器之前成功完成。

如果仅指定 FOR 关键字,则 AFTER 为默认值。

不能对视图定义 AFTER 触发器。

INSTEAD OF

指定执行 DML 触发器而不是触发 SQL 语句,因此,其优先级高于触发语句的操作。不能为 DDL 或登录触发器指定 INSTEAD OF。

对于表或视图,每个 INSERT、UPDATE 或 DELETE 语句最多可定义一个 INSTEAD OF 触发器。但是,可以为具有自己的 INSTEAD OF 触发器的多个视图定义视图。

INSTEAD OF 触发器不可以用于使用 WITH CHECK OPTION 的可更新视图。如果将 INSTEAD OF 触发器添加到指定了 WITH CHECK OPTION 的可更新视图中,则 SQL Server 将引发错误。用户须用 ALTER VIEW 删除该选项后才能定义 INSTEAD OF 触发器。

{ [DELETE] [ ,] [INSERT] [ ,] [UPDATE] }

指定数据修改语句,这些语句可在 DML 触发器对此表或视图进行尝试时激活该触发器。必须至少指定一个选项。在触发器定义中允许使用上述选项的任意顺序组合。

对于 INSTEAD OF 触发器,不允许对具有指定级联操作 ON DELETE 的引用关系的表使用 DELETE 选项。同样,也不允许对具有指定级联操作 ON UPDATE 的引用关系的表使用 UPDATE 选项。

event_type

执行之后将导致激发 DDL 触发器的 Transact-SQL 语言事件的名称。DDL 事件中列出了 DDL 触发器的有效事件。

event_group

预定义的 Transact-SQL 语言事件分组的名称。执行任何属于 event_group 的 Transact-SQL 语言事件之后,都将激发 DDL 触发器。DDL 事件组中列出了 DDL 触发器的有效事件组。

CREATE TRIGGER 运行完毕之后,event_group 还可通过将其涵盖的事件类型添加到 sys.trigger_events 目录视图中来作为宏使用。

WITH APPEND

指定应该再添加一个现有类型的触发器。仅当兼容级别等于或低于 65 时,才需要使用此可选子句。如果兼容级别等于或高于 70,则不需要使用 WITH APPEND 子句来添加现有类型的其他触发器。这是兼容级别设置等于或高于 70 的 CREATE TRIGGER 的默认行为。有关详细信息,请参阅 sp_dbcmptlevel (Transact-SQL)。

WITH APPEND 不能与 INSTEAD OF 触发器一起使用。如果显式声明了 AFTER 触发器,则也不能使用该子句。仅当为了向后兼容而指定了 FOR 时(但没有 INSTEAD OF 或 AFTER)时,才能使用 WITH APPEND。如果指定了 EXTERNAL NAME(即触发器为 CLR 触发器),则不能指定 WITH APPEND。

重要提示:
Microsoft SQL Server 的下一版本将删除 WITH APPEND。请不要在新的开发工作中使用 WITH APPEND,并准备修改当前使用它的应用程序。
NOT FOR REPLICATION

指示当复制代理修改涉及到触发器的表时,不应执行触发器。有关详细信息,请参阅使用 NOT FOR REPLICATION 来控制约束、标识和触发器。

sql_statement

触发条件和操作。触发器条件指定其他标准,用于确定尝试的 DML、DDL 或 logon 事件是否导致执行触发器操作。

尝试上述操作时,将执行 Transact-SQL 语句中指定的触发器操作。

触发器可以包含任意数量和种类的 Transact-SQL 语句,但也有例外。有关详细信息,请参阅“备注”。触发器的用途是根据数据修改或定义语句来检查或更改数据;它不应向用户返回数据。触发器中的 Transact-SQL 语句常常包含控制流语言。

DML 触发器使用 deletedinserted 逻辑(概念)表。它们在结构上类似于定义了触发器的表,即对其尝试执行了用户操作的表。在 deletedinserted 表保存了可能会被用户更改的行的旧值或新值。例如,若要检索 deleted 表中的所有值,则使用:

SELECT *
FROM deleted

有关详细信息,请参阅使用插入的和删除的表。

DDL 和登录触发器通过使用 EVENTDATA (Transact-SQL) 函数来获取有关触发事件的信息。有关详细信息,请参阅使用 EVENTDATA 函数。

示例:

A. 运用具有数据库范围的 DDL 触发器

下面的示例使用 DDL 触发器来防止从数据库中删除任何同义词。

USE AdventureWorks;
GO
IF EXISTS (SELECT * FROM sys.triggers
WHERE parent_class = 0 AND name = 'safety')
DROP TRIGGER safety
ON DATABASE;
GO
CREATE TRIGGER safety
ON DATABASE
FOR DROP_SYNONYM
AS
RAISERROR ('You must disable Trigger "safety" to drop synonyms!',10, 1)
ROLLBACK
GO
DROP TRIGGER safety
ON DATABASE;
GO

B.运用具有服务器范围的 DDL 触发器

在以下示例中,如果当前服务器实例上出现任何 CREATE DATABASE 事件,则使用 DDL 触发器输出一条消息,并使用 EVENTDATA 函数检索对应 Transact-SQL 语句的文本。

注意:

若要查看在 DDL 触发器中使用 EVENTDATA 的更多示例,请参阅联机帮助使用 EVENTDATA 函数。

IF EXISTS (SELECT * FROM sys.server_triggers
    WHERE name = 'ddl_trig_database')
DROP TRIGGER ddl_trig_database
ON ALL SERVER;
GO
CREATE TRIGGER ddl_trig_database 
ON ALL SERVER 
FOR CREATE_DATABASE 
AS 
    PRINT 'Database Created.'
    SELECT EVENTDATA().value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]','nvarchar(max)')
GO
DROP TRIGGER ddl_trig_database
ON ALL SERVER;
GO

C.使用登录触发器

下面的登录触发器示例拒绝了作为 login_test 登录名的成员登录 SQL Server 的尝试(如果在此登录名下已运行三个用户会话)。

USE master;
GO
CREATE LOGIN login_test WITH PASSWORD = '3KHJ6dhx(0xVYsdf' MUST_CHANGE,
    CHECK_EXPIRATION = ON;
GO
GRANT VIEW SERVER STATE TO login_test;
GO
CREATE TRIGGER connection_limit_trigger
ON ALL SERVER WITH EXECUTE AS 'login_test'
FOR LOGON
AS
BEGIN
IF ORIGINAL_LOGIN()= 'login_test' AND
    (SELECT COUNT(*) FROM sys.dm_exec_sessions
            WHERE is_user_process = 1 AND
                original_login_name = 'login_test') > 3
    ROLLBACK;
END;
D.查看导致触发器触发的事件

       

以下示例将查询 sys.triggerssys.trigger_events 目录视图,以确定是哪个 Transact-SQL 语言事件导致触发了触发器 safety。其中的 safety 是在前一个示例中创建的。

SELECT TE.*
FROM sys.trigger_events AS TE
JOIN sys.triggers AS T
ON T.object_id = TE.object_id
WHERE T.parent_class = 0
AND T.name = 'safety'
GO
--4.修改DDL触发器:
语法:
Trigger on a CREATE, ALTER, DROP, GRANT, DENY, REVOKE, or UPDATE statement (DDL Trigger)

ALTER TRIGGER trigger_name 
ON { DATABASE | ALL SERVER } 
[ WITH <ddl_trigger_option> [ ,...n ] ]
{ FOR | AFTER } { event_type [ ,...n ] | event_group } 
AS { sql_statement [ ; ] | EXTERNAL NAME <method specifier> 
[ ; ] }

 

5.禁用触发器

语法

DISABLE TRIGGER { [ schema_name . ] trigger_name [ ,...n ] | ALL }
ON { object_name | DATABASE | ALL SERVER } [ ; ]
示例:
A.

以下示例在数据库范围创建 DDL 触发器 safety,然后禁用该触发器。

IF EXISTS (SELECT * FROM sys.triggers
    WHERE parent_class = 0 AND name = 'safety')
DROP TRIGGER safety ON DATABASE;
GO
CREATE TRIGGER safety 
ON DATABASE 
FOR DROP_TABLE, ALTER_TABLE 
AS 
   PRINT 'You must disable Trigger "safety" to drop or alter tables!' 
   ROLLBACK;
GO
DISABLE TRIGGER safety ON DATABASE;
GO
B.禁用以同一作用域定义的所有触发器

下例禁用在服务器范围内创建的所有 DDL 触发器。

USE AdventureWorks;
GO
DISABLE Trigger ALL ON ALL SERVER;
GO
6.启用DDL触发器:
语法
ENABLE TRIGGER { [ schema_name . ] trigger_name [ ,...n ] | ALL }
ON { object_name | DATABASE | ALL SERVER } [ ; ]
示例:
A.启用 DDL 触发器

        

以下示例在数据库范围创建 DDL 触发器 safety,然后禁用该触发器。

IF EXISTS (SELECT * FROM sys.triggers
    WHERE parent_class = 0 AND name = 'safety')
DROP TRIGGER safety ON DATABASE;
GO
CREATE TRIGGER safety 
ON DATABASE 
FOR DROP_TABLE, ALTER_TABLE 
AS 
   PRINT 'You must disable Trigger "safety" to drop or alter tables!' 
   ROLLBACK;
GO
DISABLE TRIGGER safety ON DATABASE;
GO
ENABLE TRIGGER safety ON DATABASE;
GO
B.启用以同一作用域定义的所有触发器

以下示例启用在服务器作用域级别创建的所有 DDL 触发器。

USE AdventureWorks;
GO
ENABLE Trigger ALL ON ALL SERVER;
GO
7.删除DDL触发器

语法:

Trigger on a CREATE, ALTER, DROP, GRANT, DENY, REVOKE or UPDATE statement (DDL Trigger)
DROP TRIGGER trigger_name [ ,...n ]
ON { DATABASE | ALL SERVER }
[ ; ]

Trigger on a LOGON event (Logon Trigger)
DROP TRIGGER trigger_name [ ,...n ]
ON ALL SERVER

示例:

USE AdventureWorks;
GO
IF EXISTS (SELECT * FROM sys.triggers
WHERE parent_class = 0 AND name = 'safety')
DROP TRIGGER safety
ON DATABASE;
GO

相关文章:

  • quote symbol expected
  • SQL语句新建用户、对用户授权、删除用户实例
  • android文件下载!download!
  • SQL Server 2008 表变量参数(表值参数)用法
  • Java类加载器加载类顺序
  • UML类图小结
  • 系统动力学软件vensim之指数增长
  • 系统动力学软件vensim学习之一阶负反馈
  • 数字水印学习教程
  • Nature Science 2010-2011年全部期刊下载链接
  • QTE安装汉化添加新程序全过程
  • 努力我可以
  • linux 与 虚拟机共享数据
  • GNU make指南
  • Linux扩展swap分区大小
  • android图片蒙层
  • css的样式优先级
  • ES6系统学习----从Apollo Client看解构赋值
  • Hexo+码云+git快速搭建免费的静态Blog
  • JAVA之继承和多态
  • Webpack 4x 之路 ( 四 )
  • 编写高质量JavaScript代码之并发
  • 产品三维模型在线预览
  • 爬虫进阶 -- 神级程序员:让你的爬虫就像人类的用户行为!
  • 前端每日实战:70# 视频演示如何用纯 CSS 创作一只徘徊的果冻怪兽
  • 使用 Docker 部署 Spring Boot项目
  • 用 Swift 编写面向协议的视图
  • ​创新驱动,边缘计算领袖:亚马逊云科技海外服务器服务再进化
  • # .NET Framework中使用命名管道进行进程间通信
  • #android不同版本废弃api,新api。
  • #LLM入门|Prompt#1.8_聊天机器人_Chatbot
  • (09)Hive——CTE 公共表达式
  • (1/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (2)nginx 安装、启停
  • (6)【Python/机器学习/深度学习】Machine-Learning模型与算法应用—使用Adaboost建模及工作环境下的数据分析整理
  • (done) NLP “bag-of-words“ 方法 (带有二元分类和多元分类两个例子)词袋模型、BoW
  • (编程语言界的丐帮 C#).NET MD5 HASH 哈希 加密 与JAVA 互通
  • (博弈 sg入门)kiki's game -- hdu -- 2147
  • (二十四)Flask之flask-session组件
  • (附源码)springboot 智能停车场系统 毕业设计065415
  • (七)c52学习之旅-中断
  • (图)IntelliTrace Tools 跟踪云端程序
  • ****Linux下Mysql的安装和配置
  • .NET 常见的偏门问题
  • .NET开源的一个小而快并且功能强大的 Windows 动态桌面软件 - DreamScene2
  • .NET开源项目介绍及资源推荐:数据持久层 (微软MVP写作)
  • /etc/fstab 只读无法修改的解决办法
  • [1]-基于图搜索的路径规划基础
  • [Android]使用Retrofit进行网络请求
  • [ASP.NET 控件实作 Day7] 设定工具箱的控件图标
  • [AutoSar]BSW_Memory_Stack_004 创建一个简单NV block并调试
  • [BJDCTF2020]The mystery of ip
  • [BZOJ1178][Apio2009]CONVENTION会议中心
  • [ERROR] Plugin 'InnoDB' init function returned error
  • [ffmpeg] aac 音频编码