数据库结构同步之通过DDL触发器记录数据库结构的变更

简介: 需求: 在开发多人协作的项目的时候,一般要同时使用多个数据库 常见的情况有: 一个开发者用的数据库(开发库), 一个测试者用的数据库(测试库), 一个正式开放给客户的数据库(正式库), 那么这三个数据库之间的数据结构的同步就将成为一个问题 如:当开发者A在“开发库”中添加了一个表,开发者B修改了一个表.

需求:

在开发多人协作的项目的时候,一般要同时使用多个数据库

常见的情况有:

一个开发者用的数据库(开发库),

一个测试者用的数据库(测试库),

一个正式开放给客户的数据库(正式库),

那么这三个数据库之间的数据结构的同步就将成为一个问题

如:当开发者A在“开发库”中添加了一个表,开发者B修改了一个表...

这些数据库结构的变更势必要同步到“测试库”和“正式库”中去

但肉手记录数据库结构变更的方式即麻烦由容易出错...

如之奈何?

 

思考过程:

之前曾在数据库达人邹建那里看到一篇帖子(找不到了),

但试过之后发现,很多情况都会出异常...就放弃了

后来在WCF达人Artech这里看到一篇文章

追踪记录每笔业务操作数据改变的利器——SQLCDC

此文章是针对数据库表记录CURD操作的日志

并非表结构

后来我在文章评论中向Artech请教了我的问题,

得到了DDL Trigger的答案 

记下来并分享

 

代码及解释:

USE MRLH_CM;
GO
--创建记录数据库结构变更的表
CREATE TABLE LogTable (DB_User nvarchar(200), EventType nvarchar(200), SQLString nvarchar(2000),ChangeTime datetime);
GO
CREATE TRIGGER LogTrigger 
ON DATABASE 
FOR DROP_TABLE, ALTER_TABLE ,CREATE_TABLE
AS
DECLARE @data XML
SET @data = EVENTDATA()
INSERT LogTable 
   (DB_User, EventType, SQLString,ChangeTime) 
   VALUES 
   (CONVERT(nvarchar(100), CURRENT_USER), 
   @data.value('(/EVENT_INSTANCE/EventType)[1]', 'nvarchar(100)'), 
   @data.value('(/EVENT_INSTANCE/TSQLCommand)[1]', 'nvarchar(2000)'),
   GETDATE()
    ) ;
GO

 和普通的创建触发器的过程类似

就说其中的两个地方吧

1.FOR DROP_TABLE, ALTER_TABLE ,CREATE_TABLE
  这里只记录了这几个事件

  如果记录更多的事件请使用

  FOR DDL_DATABASE_LEVEL_EVENTS

  了解更多的事件情况请访问

  http://msdn.microsoft.com/en-us/library/ms186456(SQL.90).aspx

2.SET @data = EVENTDATA()
  EVENTDATA()是数据库自身的方法

  返回有关服务器或数据库事件的信息(XML格式)  

  只有直接在 DDL 或登录触发器内部引用 EVENTDATA 时,EVENTDATA 才会返回数据。

  如果 EVENTDATA 由其他例程调用(即使这些例程由 DDL 或登录触发器进行调用),将返回 NULL。

  @data.value('(/EVENT_INSTANCE/EventType)[1]

  这是使用XQUERY检索XML中的数据

  详细的XQUERY教程请看这里

  http://www.w3school.com.cn/xquery/index.asp

注意:

--想删除表LogTable必须先删除这个触发器
DROP TRIGGER LogTrigger
on database
GO
--删除表
DROP TABLE LogTable
GO

以上代码均在MSSQLSERVER2008下测试通过

其他数据库没有测试

目录
相关文章
|
20天前
|
数据管理 关系型数据库 MySQL
数据管理服务DMS支持MySQL数据库的无锁结构变更
本文介绍了使用Sysbench准备2000万数据并进行全表字段更新的操作。通过DMS的无锁变更功能,可在不锁定表的情况下完成结构修改,避免了传统方法中可能产生的锁等待问题。具体步骤包括:准备数据、提交审批、执行变更及检查表结构,确保变更过程高效且不影响业务运行。
44 2
|
4月前
|
消息中间件 资源调度 关系型数据库
如何在Flink on YARN环境中配置Debezium CDC 3.0,以实现实时捕获数据库变更事件并将其传输到Flink进行处理
本文介绍了如何在Flink on YARN环境中配置Debezium CDC 3.0,以实现实时捕获数据库变更事件并将其传输到Flink进行处理。主要内容包括安装Debezium、配置Kafka Connect、创建Flink任务以及启动任务的具体步骤,为构建实时数据管道提供了详细指导。
273 9
|
5月前
|
安全 数据库 数据安全/隐私保护
数据库 变更和版本控制管理工具 --Bytebase 安装部署
数据库 变更和版本控制管理工具 --Bytebase 安装部署
307 0
|
7月前
|
资源调度 关系型数据库 MySQL
【Flink on YARN + CDC 3.0】神操作!看完这篇教程,你也能成为数据流处理高手!从零开始,一步步教会你在Flink on YARN模式下如何配置Debezium CDC 3.0,让你的数据库变更数据瞬间飞起来!
【8月更文挑战第15天】随着Apache Flink的普及,企业广泛采用Flink on YARN部署流处理应用,高效利用集群资源。变更数据捕获(CDC)工具在现代数据栈中至关重要,能实时捕捉数据库变化并转发给下游系统处理。本文以Flink on YARN为例,介绍如何在Debezium CDC 3.0中配置MySQL连接器,实现数据流处理。首先确保YARN上已部署Flink集群,接着安装Debezium MySQL连接器并配置Kafka Connect。最后,创建Flink任务消费变更事件并提交任务到Flink集群。通过这些步骤,可以构建出从数据库变更到实时处理的无缝数据管道。
611 2
|
7月前
|
存储 SQL 数据库
触发器的设计、掌握存储过程的基本概念和创建、执行、删除方法。掌握数据库备份的方法和数据库恢复的方法。
这篇文章介绍了数据库中触发器的设计概念,包括创建、修改、删除触发器的方法,并通过实验内容教授如何使用SQL命令创建DML触发器以及如何利用触发器实现数据的完整性和自动化处理。
触发器的设计、掌握存储过程的基本概念和创建、执行、删除方法。掌握数据库备份的方法和数据库恢复的方法。
|
7月前
|
监控 物联网 关系型数据库
使用PostgreSQL触发器解决物联网设备状态同步问题
在物联网监控系统中,确保设备状态(如在线与离线)的实时性和准确性至关重要。当设备状态因外部因素改变时,需迅速反映到系统内部。因设备状态数据分布在不同表中,直接通过应用同步可能引入复杂性和错误。采用PostgreSQL触发器自动同步状态变化是一种高效方法。首先定义触发函数,在设备状态改变时更新管理模块表;然后创建触发器,在状态字段更新后执行此函数。此外,还需进行充分测试、监控性能并实施优化,以及在触发函数中加入错误处理和日志记录功能。这种方法不仅提高自动化程度,增强数据一致性与实时性,还需注意其对性能的影响并采取优化措施。
182 2
|
7月前
|
SQL 存储 关系型数据库
"MySQL增列必锁表?揭秘InnoDB在线DDL,让你的数据库操作飞一般,性能无忧!"
【8月更文挑战第11天】在数据库领域,MySQL凭借其稳定高效的表现深受开发者喜爱。对于是否会在给数据表添加列时锁表的问题,MySQL的行为受版本、存储引擎等因素影响。从5.6版起,InnoDB支持在线DDL,可在改动表结构时保持表的可访问性,避免长时间锁表。而MyISAM等则需锁表完成操作。例如,在使用InnoDB的表上运行`ALTER TABLE users ADD COLUMN email VARCHAR(255);`时,通常不会完全锁表。虽然在线DDL提高了灵活性,但复杂操作或大表变更仍可能暂时影响性能。因此,进行结构变更前应评估其影响并择机执行。
121 6
|
7月前
|
关系型数据库 MySQL 数据库
什么是数据库触发器?
【8月更文挑战第3天】
711 10
什么是数据库触发器?
|
7月前
|
SQL 存储 关系型数据库
|
8月前
|
Oracle 关系型数据库 数据库连接

热门文章

最新文章