SQL Server数据库DDL变更监控

本文涉及的产品
云数据库 RDS SQL Server,基础系列 2核4GB
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
简介: 数据库的DDL语言, 就是关系型数据库的三大类语言中的一种, 数据定义语言(Data Definition Language), 主要是数据结构和数据库对象的定义. 有CREATE , ALTER, DROP 等语句组成.工作中经常需要对数据对象变更进行监控, 可能存在以下的场景:监控所有的变更, 并保留变更记录.比如对某些表结构的变更可能需要对其他的数据库的的表进行同步变更.可能某些View的改变需要同步修改默写Stored Procedure 存储过程.某些变更需要同步修改相应的应用程序.经过研究, 可以通过全局触发器和自定义的监控Stored Procedure来实现.

数据库的DDL语言, 就是关系型数据库的三大类语言中的一种, 数据定义语言(Data Definition Language), 主要是数据结构和数据库对象的定义. 有CREATE , ALTER, DROP 等语句组成.

工作中经常需要对数据对象变更进行监控, 可能存在以下的场景:

监控所有的变更, 并保留变更记录.
比如对某些表结构的变更可能需要对其他的数据库的的表进行同步变更.
可能某些View的改变需要同步修改默写Stored Procedure 存储过程.
某些变更需要同步修改相应的应用程序.
经过研究, 可以通过全局触发器和自定义的监控Stored Procedure来实现.

首先建立一个触发器Trigger
触发器是一种特殊类型的存储过程,在数据库服务器中发生事件时自动运行。在DML语言, 即我们常用的INSERT, UPDATE 和 DELETE 操作, 可以触发特点的程序, 检查数据完整性, 同步更新等操作.

这次我们用DDL的Tigger, 建立一个全局的Server.

--============ Create Trigger ============
CREATE TRIGGER TRG_DDL_CHANGES ON ALL SERVER

FOR 
CREATE_TABLE, ALTER_TABLE, DROP_TABLE, 
CREATE_VIEW, DROP_VIEW, ALTER_VIEW

AS
BEGIN
...
END;
GO
记得需要排除对tempdb的监控, 程序处理的临时表都是创建到tempdb中的, 没有必要监控这种临时的对象.

--============ Don't log tempdb DDL ============
SET @_databaseName = EVENTDATA().value('(/EVENT_INSTANCE/DatabaseName)[1]', 'nvarchar(max)')
IF @_databaseName IN ('tempdb') RETURN

新建一个表来记录变更的记录.

CREATE TABLE dbo.DBA_DDL_CHANGE_LOG
(

LOG_ID INT IDENTITY PRIMARY KEY,
EVENT_DATA XML NOT NULL,
WARNING_TYPE VARCHAR(20) NULL,
WARNING_COMMENT NVARCHAR(200) NULL,
HANDLE_COMMENT  NVARCHAR(200) NULL,
HANDLE_BY VARCHAR(20) NULL

);
GO
记录变更的记录, 并把logId传入到自定义的存储过程中, 在这个SP中, 我们可以对我们关心的QQ账号拍卖平台对象进行不同时间的告警和相应处置.

INSERT  INTO dbo.DBA_DDL_CHANGE_LOG (event_data)
VALUES  (EVENTDATA());

SET @logId = @@IDENTITY
EXEC dbo.SP_DBA_MONITOR_DDL_CHANGE @logId

建立自定义的存储过程Stored Procedure
我建立了一张表, 用来定义一些存储监控对象的表, 如果对象在我的监控清单中, 就Raise Error, 并把事先定义好的消息提示给变更表结构的DBA, 如有必要, 可以回滚当前的变更操作.

SELECT

    @_eventType = event_data.value('(/EVENT_INSTANCE/EventType)[1]', 'nvarchar(max)'),
    @_databaseName = event_data.value('(/EVENT_INSTANCE/DatabaseName)[1]', 'nvarchar(max)'),
    @_objectName = event_data.value('(/EVENT_INSTANCE/ObjectName)[1]', 'nvarchar(max)'),
    @_objectType = event_data.value('(/EVENT_INSTANCE/ObjectType)[1]', 'nvarchar(max)')

FROM PerfAnaly.dbo.DBA_DDL_CHANGE_LOG
WHERE log_id = @logId

SELECT @_warnignComment = COMMENT,

    @_warningPurpose = MONITOR_PURPOSE

FROM dbo.DBA_DDL_MONITOR WITH (NOLOCK)
WHERE DATABASE_NAME = @_databaseName

    AND OBJECT_NAME = @_objectName
    AND OBJECT_TYPE = @_objectType

--============ Check table is in Archive or not ============
IF @_eventType IN ('ALTER_TABLE', 'DROP_TABLE', 'DROP_VIEW', 'ALTER_VIEW') AND @_warnignComment IS NOT NULL
BEGIN

UPDATE  dbo.DBA_DDL_CHANGE_LOG
SET     WARNING_TYPE = @_warningPurpose, 
        WARNING_COMMENT = @_warnignComment
WHERE   LOG_ID = @logId

RAISERROR('### %s ###: %s !!!', 11, 1, @_warningPurpose, @_warnignComment)

END
以上, 通过一个触发器, 一个监控表和一个存储过程, 就可以实现记录变更记录, 提醒变更注意事项等功能.

希望以上能够帮到你.

相关实践学习
使用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
目录
相关文章
|
13天前
|
SQL 安全 数据库
基于SQL Server事务日志的数据库恢复技术及实战代码详解
基于事务日志的数据库恢复技术是SQL Server中一个非常强大的功能,它能够帮助数据库管理员在数据丢失或损坏的情况下,有效地恢复数据。通过定期备份数据库和事务日志,并在需要时按照正确的步骤恢复,可以最大限度地减少数据丢失的风险。需要注意的是,恢复数据是一个需要谨慎操作的过程,建议在执行恢复操作之前,详细了解相关的操作步骤和注意事项,以确保数据的安全和完整。
26 0
|
16天前
|
前端开发 C# 设计模式
“深度剖析WPF开发中的设计模式应用:以MVVM为核心,手把手教你重构代码结构,实现软件工程的最佳实践与高效协作”
【8月更文挑战第31天】设计模式是在软件工程中解决常见问题的成熟方案。在WPF开发中,合理应用如MVC、MVVM及工厂模式等能显著提升代码质量和可维护性。本文通过具体案例,详细解析了这些模式的实际应用,特别是MVVM模式如何通过分离UI逻辑与业务逻辑,实现视图与模型的松耦合,从而优化代码结构并提高开发效率。通过示例代码展示了从模型定义、视图模型管理到视图展示的全过程,帮助读者更好地理解并应用这些模式。
30 0
|
16天前
|
SQL 数据处理 数据库
|
16天前
|
Java 数据库连接 数据库
告别繁琐 SQL!Hibernate 入门指南带你轻松玩转 ORM,解锁高效数据库操作新姿势
【8月更文挑战第31天】Hibernate 是一款流行的 Java 持久层框架,简化了对象关系映射(ORM)过程,使开发者能以面向对象的方式进行数据持久化操作而无需直接编写 SQL 语句。本文提供 Hibernate 入门指南,介绍核心概念及示例代码,涵盖依赖引入、配置文件设置、实体类定义、工具类构建及基本 CRUD 操作。通过学习,你将掌握使用 Hibernate 简化数据持久化的技巧,为实际项目应用打下基础。
35 0
|
16天前
|
SQL 存储 监控
|
16天前
|
API Java 数据库连接
从平凡到卓越:Hibernate Criteria API 让你的数据库查询瞬间高大上,彻底告别复杂SQL!
【8月更文挑战第31天】构建复杂查询是数据库应用开发中的常见需求。Hibernate 的 Criteria API 以其强大和灵活的特点,允许开发者以面向对象的方式构建查询逻辑,同时具备 SQL 的表达力。本文将介绍 Criteria API 的基本用法并通过示例展示其实际应用。此 API 通过 API 构建查询条件而非直接编写查询语句,提高了代码的可读性和安全性。无论是简单的条件过滤还是复杂的分页和连接查询,Criteria API 均能胜任,有助于提升开发效率和应用的健壮性。
26 0
|
16天前
|
JSON 数据格式 Java
化繁为简的魔法:Struts 2 与 JSON 联手打造超流畅数据交换体验,让应用飞起来!
【8月更文挑战第31天】在现代 Web 开发中,JSON 成为数据交换的主流格式,以其轻量、易读和易解析的特点受到青睐。Struts 2 内置对 JSON 的支持,结合 Jackson 库可便捷实现数据传输。本文通过具体示例展示了如何在 Struts 2 中进行 JSON 数据的序列化与反序列化,并结合 AJAX 技术提升 Web 应用的响应速度和用户体验。
34 0
|
26天前
|
SQL 关系型数据库 MySQL
【揭秘】MySQL binlog日志与GTID:如何让数据库备份恢复变得轻松简单?
【8月更文挑战第22天】MySQL的binlog日志记录数据变更,用于恢复、复制和点恢复;GTID为每笔事务分配唯一ID,简化复制和恢复流程。开启binlog和GTID后,可通过`mysqldump`进行逻辑备份,包含binlog位置信息,或用`xtrabackup`做物理备份。恢复时,使用`mysql`命令执行备份文件,或通过`innobackupex`恢复物理备份。GTID模式下的主从复制配置更简便。
109 2
|
21天前
|
弹性计算 关系型数据库 数据库
手把手带你从自建 MySQL 迁移到云数据库,一步就能脱胎换骨
阿里云瑶池数据库来开课啦!自建数据库迁移至云数据库 RDS原来只要一步操作就能搞定!点击阅读原文完成实验就可获得一本日历哦~
|
24天前
|
关系型数据库 MySQL 数据库
RDS MySQL灾备服务协同解决方案构建问题之数据库备份数据的云上云下迁移如何解决
RDS MySQL灾备服务协同解决方案构建问题之数据库备份数据的云上云下迁移如何解决