监控数据库DDL操作日志

背景

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

测试环境

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监控日志记录
1 --新建监控库,如果已存在该数据库,可以不执行
2 USE master;
3 IF DB_ID(‘azure_monitor‘) IS NOT NULL
4     DROP DATABASE azure_monitor;
 1 CREATE DATABASE azure_monitor
 2 ON
 3 --请根据实际情况选择监控库的存放路径
 4 (   NAME = azure_monitor,
 5     FILENAME = ‘d:\azure_monitor.mdf‘,
 6     FILEGROWTH = 50MB
 7 )
 8 LOG ON
 9 (   NAME = azure_monitor_log,
10     FILENAME = ‘d:\azure_monitore_log.ldf‘,
11     FILEGROWTH = 50MB
12 );
1 USE master;
2 ALTER DATABASE azure_monitor SET RECOVERY SIMPLE;
 1 USE [azure_monitor];
 2 CREATE TABLE [dbo].[monitor_DatabaseLog]
 3 (
 4     [DatabaseLogID] [INT] IDENTITY(1, 1) NOT NULL,
 5     [PostTime] [DATETIME] NOT NULL,
 6     [DatabaseUser] [sysname] NOT NULL,
 7     [LoginName] [sysname] NOT NULL,
 8     [Event] [sysname] NOT NULL,
 9     [databasename] [sysname] NULL,
10     [Schema] [sysname] NULL,
11     [Object] [sysname] NULL,
12     [TSQL] [NVARCHAR](MAX) NOT NULL,
13     [XmlEvent] [XML] NOT NULL,
14     CONSTRAINT [PK_DatabaseLog_DatabaseLogID]
15         PRIMARY KEY NONCLUSTERED ([DatabaseLogID] ASC)
16         WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,
17                  IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON,
18                  ALLOW_PAGE_LOCKS = ON
19              ) ON [PRIMARY]
20 ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY];
21 GO
第二步.新建实例级别的触发器
 1 CREATE TRIGGER [ddlDatabaseTriggerLog]
 2 ON ALL SERVER
 3 WITH EXECUTE AS ‘sa‘  ---根据实际情况选择
 4 FOR DDL_DATABASE_LEVEL_EVENTS, CREATE_DATABASE, DROP_DATABASE, ALTER_DATABASE, CREATE_LOGIN
 5 AS
 6 BEGIN
 7     SET NOCOUNT ON;
 8     DECLARE @data XML;
 9     DECLARE @LoginName sysname;
10     DECLARE @databasename sysname;
11     DECLARE @schema sysname;
12     DECLARE @object sysname;
13     DECLARE @eventType sysname;
14     SET @data = EVENTDATA();
15     SET @LoginName
16         = @data.value(‘(/EVENT_INSTANCE/LoginName)[1]‘, ‘sysname‘);
17     SET @databasename
18         = @data.value(‘(/EVENT_INSTANCE/DatabaseName)[1]‘, ‘sysname‘);
19     SET @eventType
20         = @data.value(‘(/EVENT_INSTANCE/EventType)[1]‘, ‘sysname‘);
21     SET @schema = @data.value(‘(/EVENT_INSTANCE/SchemaName)[1]‘, ‘sysname‘);
22     SET @object = @data.value(‘(/EVENT_INSTANCE/ObjectName)[1]‘, ‘sysname‘);
23     IF @object IS NOT NULL
24         PRINT ‘  ‘ + @eventType + ‘ - ‘ + @databasename + ‘.‘ + @schema + ‘.‘
25               + @object;
26     ELSE
27         PRINT ‘  ‘ + @eventType + ‘ - ‘ + @databasename + ‘.‘ + @schema;
28     IF @eventType IS NULL
29         PRINT CONVERT(NVARCHAR(MAX), @data);
30     ---写入的日志记录对应的库名是否正确
31     INSERT [azure_monitor].[dbo].[monitor_DatabaseLog]
32     (   [PostTime],
33         [DatabaseUser],
34         [LoginName],
35         [Event],
36         [databasename],
37         [Schema],
38         [Object],
39         [TSQL],
40         [XmlEvent]
41     )
42     VALUES
43     (   GETDATE(),
44         CONVERT(sysname, CURRENT_USER),
45         CONVERT(sysname, @LoginName),
46         @eventType,
47         CONVERT(sysname, @databasename),
48         CONVERT(sysname, @schema),
49         CONVERT(sysname, @object),
50         @data.value(‘(/EVENT_INSTANCE/TSQLCommand)[1]‘, ‘nvarchar(max)‘),
51         @data
52     );
53 END;
54 GO

监控效果

后记

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

参考

create trigger

时间: 2024-10-13 03:05:44

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

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

原文:Replication的犄角旮旯(六)-- 一个DDL引发的血案(上)(如何近似估算DDL操作进度) <Replication的犄角旮旯>系列导读 Replication的犄角旮旯(一)--变更订阅端表名的应用场景 Replication的犄角旮旯(二)--寻找订阅端丢失的记录 Replication的犄角旮旯(三)--聊聊@bitmap Replication的犄角旮旯(四)--关于事务复制的监控 Replication的犄角旮旯(五)--关于复制identity列 Replicati

DDL数据库查询操作学习

一 数据库初识 l SQL是Structured Query Language(结构化查询语言)的缩写. l SQL是专为数据库而建立的操作命令集,是一种功能齐全的数据库语言. 在使用它时,只需要发出“做什么”的命令,“怎么做”是不用使用者考虑的. 二 数据库的组成 l 1.一个SQL数据库是表(Table)的集合,它由一个或多个SQL模式定义. l 2.一个SQL表由行集构成,一行是列的序列(集合),每列与行对应一个数据项. l 3.一个表或者是一个基本表或者是一个视图.基本表是实际存储在数据

【转】SQLServer 2008以上误操作数据库恢复方法——日志尾部备份

4号,公司的生产数据表被全部删除,目前没有找到原因,由于刚接触SQL不久,所以短时间内不会还原,也不敢动被原服务器,于是就将原服务器停掉,拷贝出里面的PPD数据库文件,留作备份:近几天在自己的电脑上尝试修复,一直没有成功,细读了一下<SQL2005技术内幕——存储引擎>了解到删除列.删除表这些操作不会直接对每一行数据进行操作,而是直接改变他们的物理指向地址的ID,专业术语我也不是很清楚,我的理解是这样的,有时间再弄清楚,不过这足以让我明白被删除的表还是存在mdf文件中,其改变的便宜地址记录在日

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

问题: 经常看到有人误删数据,或者误操作,特别是update和delete的时候没有加where,然后就喊爹喊娘了.人非圣贤孰能无过,做错可以理解,但不能纵容,这个以后再说,现在先来解决问题. 遇到这种情况,一般都是没有做备份,不然也不会来发问了.首先要冷静,否则会有更大的灾难.直到你放弃. 解决方法: 对于这类问题,主要是找回误操作之前的数据,在2008之前,有个很出名的工具Log Exploer,听说还挺好用的,这个网上大把教程,这里就不多说了.但是唯一遗憾的是,不支持2008及更高版本,这

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

在spring xml配置文件中添加配置,包含:model.listener 在model中增加需要写入数据库对应表的model 在auditLog.xml配置文件中配置自己项目中,需要进行日志记录的model类shortName,以及相关属性. 相关代码如下: 首先spring xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframew

异步往数据库中插入每个用户的增删改操作日志

[x] ++我们需要一个工具类++ 用工具类异步向数据库中插入用户的操作日志 工具类代码如下: package com.dp.api.util; import com.dp.common.dao.DaoUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframew

DDL 操作数据库

DDL 操作数据库:常用的操作 CRUD 一.C(create)创建 1.创建数据库 create database 数据库名称; 2.创建数据库,判断是否存在,再创建(如果存在,就不再创建) create database if not exists 数据库名称; 3.创建数据库,并指定字符集 create database 数据库名称 character set 字符集名; Demo : 创建 DB1 数据库,判断是否存在,并制定字符集为 utf8: create database if n

MySQL/MariaDB基础性知识及DDL操作详解

前言 MySQL/MariaDB是一个开放源码的小型关联式数据库管理系统,由于其体积小.速度快.总体拥有成本低,尤其是开放源码这一特点,许多中小型网站为了降低网站总体拥有成本而选择了MySQL/MariaDB作为网站数据库. 基础架构 MySQL核心组件 连接池:认证.线程重用.连接数限制.内存检查.缓存 SQL接口:DDL, DML, 关系型数据库的基本抽象 parser: 查询转换.对象权限检查 优化器:访问路径,性能相关的统计数据 caches和buffers:与存储引擎自身相关的I/O性

oracle11g系统级别触发器来跟踪监控drop误操作

前言: db中有一张表的数据老是紊乱,猜猜是经历过drop.create的数据同步操作,但是现在谁也不知道在哪里操作的,所以准备做一个触发器去记录下是哪个应用服务器那个db账号操作的. 3,系统级别触发器 3.1 触发事件 包括各种DDL操作以及各种数据库事件,ddl包括create.alter.drop.rename.grant.revoke.audit.noaudit.commit.truncate.analyze.associate statistics.disassociate stat