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

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

若是创建服务器级别的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
相关文章
|
8天前
|
弹性计算 持续交付 Docker
阿里云云效产品使用合集之如何部署到阿里云服务器上的 Windows Server 上的 IIS
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。
|
15天前
|
网络协议 Unix 网络安全
FTP服务器怎么搭建?Windows server搭建FPT服务器
FTP服务器是按照FTP协议提供文件传输服务的计算机。它用于在两台计算机间安全地传输文件,支持用户权限管理和跨平台操作。FTP使用控制连接处理命令,数据连接传输文件,有PORT和PASV模式。要搭建FTP服务器,首先在Windows Server 2008 R2上安装IIS,确保选中FTP服务。接着,创建FTP文件夹作为站点根目录,通过IIS管理器添加FTP站点,配置站点信息、身份验证和权限。测试客户端通过telnet和浏览器访问FTP服务器,确认能成功登录及浏览文件。FTP常用于文件共享和管理,可通过专用工具如FlashFXP上传下载文件。
42 0
FTP服务器怎么搭建?Windows server搭建FPT服务器
|
1月前
|
SQL 关系型数据库 API
Flink(十三)【Flink SQL(上)SqlClient、DDL、查询】(1)
Flink(十三)【Flink SQL(上)SqlClient、DDL、查询】
Flink(十三)【Flink SQL(上)SqlClient、DDL、查询】(1)
|
1月前
|
监控 Linux BI
【linux服务器系统盘爆满】/www/server/total/logs/目录内容过多导致服务器系统盘爆满,/www/server/total/logs/ 里是什么内容?是否可以删除?
【linux服务器系统盘爆满】/www/server/total/logs/目录内容过多导致服务器系统盘爆满,/www/server/total/logs/ 里是什么内容?是否可以删除?
19 1
|
21天前
|
关系型数据库 MySQL Java
软件开发2003 -Can·t to MySQL server on ‘xxxxxx‘(10038),宝塔初始化安装mysql,远程链接MySql注意事项,开始时服务器是没有放开端口的,宝塔也都开
软件开发2003 -Can·t to MySQL server on ‘xxxxxx‘(10038),宝塔初始化安装mysql,远程链接MySql注意事项,开始时服务器是没有放开端口的,宝塔也都开
|
1月前
|
SQL 流计算
Flink(十三)【Flink SQL(上)SqlClient、DDL、查询】(4)
Flink(十三)【Flink SQL(上)SqlClient、DDL、查询】
|
1月前
|
SQL Java 流计算
Flink(十三)【Flink SQL(上)SqlClient、DDL、查询】(3)
Flink(十三)【Flink SQL(上)SqlClient、DDL、查询】
|
1月前
|
SQL 消息中间件 存储
Flink(十三)【Flink SQL(上)SqlClient、DDL、查询】(2)
Flink(十三)【Flink SQL(上)SqlClient、DDL、查询】
|
1月前
|
SQL 存储 关系型数据库
MySQL数据库——SQL(1)-SQL通用语法、SQL分类、DDL(数据库操作、表操作)
MySQL数据库——SQL(1)-SQL通用语法、SQL分类、DDL(数据库操作、表操作)
32 1
|
1月前
|
SQL 关系型数据库 MySQL
零基础学习数据库SQL语句之定义数据库对象的DDL语句
零基础学习数据库SQL语句之定义数据库对象的DDL语句
22 0