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

本文涉及的产品
云数据库 RDS SQL Server,基础系列 2核4GB
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
简介:

若是创建服务器级别的DDL触发器,只要把先前的ON DATABASE改为ON ALL SERVER,即可跟踪服务器级别的事件,使用的原理与数据库级别的DDL触发器相似,区别只在跟踪的事件不同。

 

1
2
3
4
5
6
CREATE  TRIGGER  ddl_trig_login
ON  ALL  SERVER
FOR  DDL_LOGIN_EVENTS
AS
PRINT n’ ALTER  LOGIN EVENT’
SELECT  EVENTDATA().value(‘(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]’,’nvarchar( max )’)

 

跟踪DDL_LOGIN_EVENTS类型事件,只要有新建、修改、删除登录帐号的事件发生,触发器就会执行程序,同样也可以利用EVENTDATA()函数取得触发器执行时相关的系统信息。可以通过如下语句来测试:

 

1
CREATE  LOGIN test  WITH  PASSWORD =’Mpdfzh7’

 

同样地,如果要删除服务器级别的DDL触发器,和数据库级别的DDL触发器差不多,只是改成ON ALL SERVER即可,请参考如下语句:

 

1
2
DROP  TRIGGER  ddl_trig_login
ON  ALL  SERVER

 

当要禁止某个人或某个应用程序登录SQL Server时,也可以通过LOGON事件所引发的触发器。例如,SQL Server 2008后,Management Studio所提供的T-SQL IntelliSense功能会占据少许服务器的CPU和内存资源。若服务器端的数据对象不多,影响较小;但若对象很多,同时联机编辑的用户也很多,则会耗掉较大的资源。你可以通过LOGON事件所引发的触发器。不准SQL Server Management Studio工具程序用来查询T-SQL IntelliSense所需数据的连接登录。

 

首先,通过SQL Server Profiler工具程序观察,当Management Studio的T-SQL编辑器要取得服务器端数据对象,以提供开发程序T-SQL IntelliSense时,会用什么样的应用程序名称登录SQL Server,录制结果如下。(备注:作者使用SQL Server 2012录制,没有捕获到该应用的相关事件,下面测试在SQL Server 2008 R2下完成,SQL Server 2008 R2 Management Studio的T-SQL编辑环境会先查询服务器端的对象后,再提供T-SQL编写时的IntelliSense功能)

 

clip_image001

 

针对LOGON事件,创建简单服务器级别的DDL触发器后,通过APP_NAME系统函数判断登录的应用程序名称,若类似“Microsoft SQL Server Management Studio - Transact-SQL IntelliSense”,便通过ROLLBACK命令使其无法连接,代码如下。

 

1
2
3
4
5
6
7
CREATE  TRIGGER  IntelliSense_Connection_Limit_Trigger
ON  ALL  SERVER  FOR  LOGON
AS
BEGIN
IF APP_NAME()  LIKE  ‘% Microsoft SQL Server Management Studio - Transact-SQL IntelliSense %’
ROLLBACK ;
END ;

 

执行之后,SQL Server 2008 R2 Management Studio的T-SQL编辑器所提供的IntelliSense功能就失效了。

 

利用相同的技巧,也可以写一个DDL触发器,当服务器连接过多时,就不准再创建新的、不重要的连接,以维持数据库的稳定和效率,并让既有的连接得以完成工作。免得系统在极为忙碌时,再加一条连接,有如最后一根稻草,压垮已经运行一阵的其他业务。不过,若真这么做,你可能要为了服务器的管理而跟开发人员吵架了。

 

另外,当设置SQL Server 2008 R2所提供的“Policies”机制,其“Evaluation Mode”为“on change -- prevent”时,SQL Server也是利用服务器几倍的DDL触发器,在事件发生后,立即评估其操作内容是否符合先前指定的策略,若违反策略,便ROLLBACK回滚原始状况。

 

clip_image002

 

clip_image003

 

在设置“Policies”时,需要“Evaluation Mode”为“on change -- prevent”,且“Enabled”,才会自动创建服务器级别的DDL触发器。若实际观察该触发器,可以看到如下内容。

 

1
2
3
4
5
6
7
8
9
CREATE  TRIGGER  [syspolicy_server_trigger]  ON  ALL  SERVER
WITH  EXECUTE  AS  '##MS_PolicyEventProcessingLogin##'
FOR  ALTER_AUTHORIZATION_DATABASE,ALTER_PROCEDURE,ALTER_SCHEMA,CREATE_PROCEDURE,RENAME
AS
BEGIN
DECLARE  @event_data xml
SELECT  @event_data = EVENTDATA()
EXEC  [msdb].[dbo].[sp_syspolicy_dispatch_event] @event_data = @event_data, @synchronous = 1
END















本文转自UltraSQL51CTO博客,原文链接:http://blog.51cto.com/ultrasql/1598188  ,如需转载请自行联系原作者


相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情: https://www.aliyun.com/product/rds/sqlserver
相关文章
|
7天前
|
SQL 存储 数据管理
深入理解SQL中的触发器
【8月更文挑战第31天】
8 0
|
2月前
|
SQL 弹性计算 资源调度
云服务器 ECS产品使用问题之bin/spark-sql --master yarn如何进行集群模式运行
云服务器ECS(Elastic Compute Service)是各大云服务商阿里云提供的一种基础云计算服务,它允许用户租用云端计算资源来部署和运行各种应用程序。以下是一个关于如何使用ECS产品的综合指南。
|
1月前
|
SQL 存储 关系型数据库
|
3月前
|
存储 SQL 数据库
SQL 语言:存储过程和触发器
SQL 语言:存储过程和触发器
54 6
|
4月前
|
SQL Oracle 关系型数据库
数据库sqlserver-----触发器的插入,更新和删除
数据库sqlserver-----触发器的插入,更新和删除
151 3
|
3月前
|
SQL 存储 关系型数据库
sql数据库服务器
SQL数据库服务器是由Microsoft所开发的数据库服务器,它可以让一个企业利用Internet/Intranet来整合所需的数据库。SQL Server最初是由Sybase提供的,但Microso
|
4月前
|
存储 SQL
SQL Server 存储过程 触发器 事务处理
SQL Server 存储过程 触发器 事务处理
|
4月前
|
SQL 资源调度 分布式数据库
Flink SQL 问题之服务器报错如何解决
Flink SQL报错通常指在使用Apache Flink的SQL接口执行数据处理任务时遇到的问题;本合集将收集常见的Flink SQL报错情况及其解决方法,帮助用户迅速恢复数据处理流程。
101 3
|
4月前
|
SQL 存储 数据库
PL/SQL触发器的概述和用途
PL/SQL触发器的概述和用途
55 2
|
4月前
|
SQL 关系型数据库 MySQL
⑩⑥ 【MySQL】详解 触发器TRIGGER,协助 确保数据的完整性,日志记录,数据校验等操作。
⑩⑥ 【MySQL】详解 触发器TRIGGER,协助 确保数据的完整性,日志记录,数据校验等操作。
66 0

热门文章

最新文章

下一篇
DDNS