背景

为了监控好生产环境下各个数据库服务器上DDL操作日志,便于运维工程师管控好风险,我们有必要关注当前实例下的所有的DDL操作以及对应的IP和hostname。

测试环境

Microsoft SQL Server 2012 - 11.0.2218.0 (X64) 
Jun 12 2012 13:05:25 
Copyright (c) Microsoft Corporation
Developer Edition (64-bit) on Windows NT 6.2 <X64> (Build 9200: )

操作步骤

第一步.在监控库中新建DDL监控表用来存放DDL监控日志记录
 --新建监控库,如果已存在该数据库,可以不执行
USE master;
IF DB_ID('azure_monitor') IS NOT NULL
DROP DATABASE azure_monitor;
 CREATE DATABASE azure_monitor
ON
--请根据实际情况选择监控库的存放路径
( NAME = azure_monitor,
FILENAME = 'd:\azure_monitor.mdf',
FILEGROWTH = 50MB
)
LOG ON
( NAME = azure_monitor_log,
FILENAME = 'd:\azure_monitore_log.ldf',
FILEGROWTH = 50MB
);
 USE master;
ALTER DATABASE azure_monitor SET RECOVERY SIMPLE;
 
 USE [azure_monitor];

 CREATE TABLE [dbo].[monitor_DatabaseLog]
(
[DatabaseLogID] [INT] IDENTITY(1, 1) NOT NULL,
[PostTime] [DATETIME] NOT NULL,
[DatabaseUser] [sysname] NOT NULL,
[LoginName] [sysname] NOT NULL,
[Event] [sysname] NOT NULL,
[databasename] [sysname] NULL,
[Schema] [sysname] NULL,
[Object] [sysname] NULL,
[TSQL] [NVARCHAR](MAX) NOT NULL,
[XmlEvent] [XML] NOT NULL,
[IP] [NVARCHAR](32) NULL,
[hostname] [NVARCHAR](100) NULL,
CONSTRAINT [PK_DatabaseLog_DatabaseLogID]
PRIMARY KEY NONCLUSTERED ([DatabaseLogID] ASC)
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,
IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON
) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]; GO
第二步.新建实例级别的触发器
 CREATE TRIGGER [ddlDatabaseTriggerLog]
ON ALL SERVER
WITH EXECUTE AS 'sa' --根据实际情况选择
FOR DDL_DATABASE_LEVEL_EVENTS, CREATE_DATABASE, DROP_DATABASE, ALTER_DATABASE, CREATE_LOGIN
AS
BEGIN
SET NOCOUNT ON; DECLARE @data XML;
DECLARE @LoginName sysname;
DECLARE @databasename sysname;
DECLARE @schema sysname;
DECLARE @object sysname;
DECLARE @eventType sysname;
DECLARE @ip VARCHAR(32) =
(
SELECT client_net_address
FROM sys.dm_exec_connections
WHERE session_id = @@SPID
); DECLARE @hostname NVARCHAR(100) = HOST_NAME(); SET @data = EVENTDATA();
SET @LoginName
= @data.value('(/EVENT_INSTANCE/LoginName)[1]', 'sysname');
SET @databasename
= @data.value('(/EVENT_INSTANCE/DatabaseName)[1]', 'sysname');
SET @eventType
= @data.value('(/EVENT_INSTANCE/EventType)[1]', 'sysname');
SET @schema = @data.value('(/EVENT_INSTANCE/SchemaName)[1]', 'sysname');
SET @object = @data.value('(/EVENT_INSTANCE/ObjectName)[1]', 'sysname'); IF @object IS NOT NULL
PRINT ' ' + @eventType + ' - ' + @databasename + '.' + @schema + '.'
+ @object;
ELSE
PRINT ' ' + @eventType + ' - ' + @databasename + '.' + @schema; IF @eventType IS NULL
PRINT CONVERT(NVARCHAR(MAX), @data);
---检查写入的日志记录对应的库名是否正确
INSERT [azure_monitor].[dbo].[monitor_DatabaseLog]
( [PostTime],
[DatabaseUser],
[LoginName],
[Event],
[databasename],
[Schema],
[Object],
[TSQL],
[XmlEvent],
[ip],
[hostname]
)
VALUES
( GETDATE(),
CONVERT(sysname, CURRENT_USER),
CONVERT(sysname, @LoginName),
@eventType,
CONVERT(sysname, @databasename),
CONVERT(sysname, @schema),
CONVERT(sysname, @object),
@data.value('(/EVENT_INSTANCE/TSQLCommand)[1]', 'nvarchar(max)'),
@data,
@ip,
@hostname
);
END;

监控效果

后记

  1. 所有的人员登陆都已提前开设好各自的登陆用户;
  2. 严格隔离区分不同的人员之间操作权限;

---清空记录存储过程
CREATE PROCEDURE [dbo].[usp_PurgeOldData_databaselog] ( @PurgeWaits SMALLINT )
AS
BEGIN;
IF @PurgeWaits IS NULL
BEGIN;
RAISERROR(N'Input parameters cannot be NULL', 16, 1);
RETURN;
END;
DELETE FROM [dbo].[monitor_DatabaseLog]
WHERE [PostTime] < GETDATE() - @PurgeWaits;
END; GO

参考

监控数据库DDL操作日志的更多相关文章

  1. 数据库DDL操作

    DDL1. 数据库* 查看所有数据库:SHOW DATABASES* 切换(选择要操作的)数据库:USE 数据库名* 创建数据库:CREATE DATABASE [IF NOT EXISTS] myd ...

  2. 创建日志表记录DML操作和DDL操作

    创建一个日志表,记录dept表的DML操作 create table dept_log(logid number,type varchar2(50),logdate date,deptno numbe ...

  3. Replication的犄角旮旯(六)-- 一个DDL引发的血案(上)(如何近似估算DDL操作进度)

    <Replication的犄角旮旯>系列导读 Replication的犄角旮旯(一)--变更订阅端表名的应用场景 Replication的犄角旮旯(二)--寻找订阅端丢失的记录 Repli ...

  4. 数据库级别DDL操作监控审计、数据库触发器/服务器触发器

    关键词:数据库触发器/服务器触发器  ,数据库级别DDL操作监控审计,禁止修改登录名密码 [1]数据库级别DDL操作监控审计 转自2012示例库,只能数据库级别,不能实例级别 use database ...

  5. 监控SQL:通过SQL Server的DDL触发器来监控数据库结构的变化(1)

    原文:监控SQL:通过SQL Server的DDL触发器来监控数据库结构的变化(1) 如果你要同步不同数据库之间的数据,首先会想到的是数据库复制技术,但如果让你同步数据库的结构,你会想到什么呢? 下面 ...

  6. SSH基于Hibernate eventListener 事件侦听器的操作日志自动保存到数据库

    在spring xml配置文件中添加配置,包含:model.listener 在model中增加需要写入数据库对应表的model 在auditLog.xml配置文件中配置自己项目中,需要进行日志记录的 ...

  7. SQLServer 2008以上误操作数据库恢复方法——日志尾部备份(转)

    问题: 经常看到有人误删数据,或者误操作,特别是update和delete的时候没有加where,然后就喊爹喊娘了.人非圣贤孰能无过,做错可以理解,但不能纵容,这个以后再说,现在先来解决问题. 遇到这 ...

  8. [转]SQLServer 2008以上误操作数据库恢复方法——日志尾部备份

    原文出处:http://blog.csdn.net/dba_huangzj/article/details/8491327 问题: 经常看到有人误删数据,或者误操作,特别是update和delete的 ...

  9. SQL Server 2008以上误操作数据库恢复方法——日志尾部备份

    原文出处:http://blog.csdn.net/dba_huangzj/article/details/8491327 问题: 经常看到有人误删数据,或者误操作,特别是update和delete的 ...

随机推荐

  1. scala学习(4)---Array定长数组操作

    ScalaArrayNote: https://www.jianshu.com/p/d906f00c05bf

  2. 【转载】网易极客战记官方攻略-地牢- 迷一般的 Kithmaze

    关卡连接: https://codecombat.163.com/play/level/riddling-kithmaze 如果你第一次走上歧途,改变你的循环来找到出路. 简介: 敬请期待! 默认代码 ...

  3. BZOJ3157 国王奇遇记——神奇的推式子

    先膜一发Miskcoo,大佬的博客上多项式相关的非常全 原题戳我 题目大意 求 \[\sum\limits_{i=1}^{n}i^mm^i\] 题解 设一个函数\(f(i)=\sum\limits_{ ...

  4. PHP处理base64编码字符串

    接收前端传过来的base64编码后的字符串, 如果是json字符串, 那么PHP使用file_get_contents('php://input'); 来接收. 本次这里是以post传参的形式传bas ...

  5. MFC 画笔CPen、画刷CBrush

    新建单个文档的MFC应用程序,类视图——View项的属性——消息,WM_PAINT,创建OnPaint()函数 dc默认有一个画笔(实心1像素宽黑线). CPen画笔非实心线像素宽必须为1,否则膨胀接 ...

  6. 015_linuxC++之_覆写

    34.类成员函数的重载.覆盖和隐藏区别?答案:a.成员函数被重载的特征:(1)相同的范围(在同一个类中):(2)函数名字相同:(3)参数不同:(4)virtual 关键字可有可无.b.覆盖是指派生类函 ...

  7. Windows下安装Elasticsearch6.4.1和Head,IK分词器

    所需运行环境 1.安装jdk1.8(步骤略) 2.安装git(步骤略)3.安装nodejs(步骤略) 一.ElasticSearch的安装 下载elasticsearch6.4.1,将下载后的es解压 ...

  8. 如何检测域名是否被微信屏蔽 微信域名检测接口API是如何实现

    微信域名检测技术的主要用户是微信域名防封,大家知道拼多多这种网站,靠诱导分享方式在微信里面摇身一变已经估值160亿美元,身价仅次于京东了 ,这是何等的速度,简直是惊为天人,but 如果你想玩微信病毒营 ...

  9. MySQL之pymysql

    pymysql的安装 pip install PyMySQL 连接数据库   import pymysql db = pymysql.connect("数据库ip","用 ...

  10. Leetcode题目56.合并区间(中等)

    题目描述: 给出一个区间的集合,请合并所有重叠的区间. 示例 1: 输入: [[1,3],[2,6],[8,10],[15,18]] 输出: [[1,6],[8,10],[15,18]] 解释: 区间 ...