DDL触发器的应用

一般来说,DML触发器可以监测得到具体对象的具体数据的变更。然而,DDL触发器则能够对一些服务器的行为作出监控,比如我们可以利用DDL触发器来做登录限制啊,做一些日志控制啊之类的。

好,然后简单粗暴上例子

首先我们做一个监控创建表的触发器,DDL触发器,一个关键点是在于 EVENTDATA() 这个函数提供的信息。

CREATE TRIGGER TR_CreateTable ON ALL SERVER FOR CREATE_TABLE
AS
BEGIN
    SELECT EVENTDATA();

END
GO

在其他情况下,调用 EVENTDATA(),它返回的恒定是一个NULL值,然而,当在DDL触发器里面,它在作用就至关重大了,基本上需要捕获的消息,都可以通过这个函数获取,这个对于这个函数,返回的结构可以参考如下

<EVENT_INSTANCE>
  <EventType>CREATE_TABLE</EventType>
  <PostTime>2015-12-19T11:03:45.223</PostTime>
  <SPID>54</SPID>
  <ServerName>IN</ServerName>
  <LoginName>sa</LoginName>
  <UserName>dbo</UserName>
  <DatabaseName>Test</DatabaseName>
  <SchemaName>dbo</SchemaName>
  <ObjectName>T1</ObjectName>
  <ObjectType>TABLE</ObjectType>
  <TSQLCommand>
    <SetOptions ANSI_NULLS="ON" ANSI_NULL_DEFAULT="ON" ANSI_PADDING="ON" QUOTED_IDENTIFIER="ON" ENCRYPTED="FALSE" />
    <CommandText>CREATE TABLE T1(ID INT)</CommandText>
  </TSQLCommand>
</EVENT_INSTANCE>

要记录的东西基本都有了。稍加处理,即可做成操作记录了。

然后我们改造一下这个触发器,变成新增修改表都要触发,然后执行如下语句

ALTER TRIGGER TR_CreateTable ON ALL SERVER FOR CREATE_TABLE,ALTER_TABLE
AS
BEGIN
    SELECT EVENTDATA();
    SELECT EVENTDATA().value(‘(EVENT_INSTANCE/EventType)[1]‘,‘varchar(50)‘),
           EVENTDATA().value(‘(EVENT_INSTANCE/ObjectName)[1]‘,‘varchar(50)‘);
END
GO

ALTER TABLE T1 ADD col1 VARCHAR(50)
<EVENT_INSTANCE>
  <EventType>ALTER_TABLE</EventType>
  <PostTime>2015-12-19T11:19:21.947</PostTime>
  <SPID>54</SPID>
  <ServerName>IN</ServerName>
  <LoginName>sa</LoginName>
  <UserName>dbo</UserName>
  <DatabaseName>Test</DatabaseName>
  <SchemaName>dbo</SchemaName>
  <ObjectName>T1</ObjectName>
  <ObjectType>TABLE</ObjectType>
  <AlterTableActionList>
    <Create>
      <Columns>
        <Name>col1</Name>
      </Columns>
    </Create>
  </AlterTableActionList>
  <TSQLCommand>
    <SetOptions ANSI_NULLS="ON" ANSI_NULL_DEFAULT="ON" ANSI_PADDING="ON" QUOTED_IDENTIFIER="ON" ENCRYPTED="FALSE" />
    <CommandText>ALTER TABLE T1 ADD col1 VARCHAR(50)</CommandText>
  </TSQLCommand>
</EVENT_INSTANCE>

看,比前面新增Table多出了  AlterTableActionList 这个节点。所以说,不同的时间,显示出来的格式都不一样。可以做的东西也千变万化,只是有一点,临时对象不会触发DDL触发器。

PS:1、登录触发器不能有返回结果集

2、登录触发器不能运行出错,慎重,不然就什么都干不了。(不要问我怎么知道的)

  3、任何功能都都有优点和缺点,只有最适合的,没有最优的~么么么哒

  4、欢迎各位指教拍砖

时间: 2024-10-16 18:53:44

DDL触发器的应用的相关文章

DDL触发器抓取赋权操作

近期在对接中,业务(数据挖掘同事)需要将部分账号控制到表级别,只允许部分账号访问指定的表. 而这些人员是不确定的,并且变动将较为频繁. 与对接同事沟通后采用如下方案实现: 给此同事开通此数据库的db_securityadmin角色账号,此账号可以在库级别范围内给其他用户赋予表级别权限. 新建一个数据库,并在其中新增一张记录相应操作的日志表. 赋予此账户写入log表操作(grant insert)其余权限无 新建库级别的DDL触发器,通过此触发器获取相应的权限操作变动记录(grant,deny,r

SQL Server 存储过程版本控制-DDL触发器

存储过程版本控制-DDL触发器 –参考:存储过程版本控制 http://enjoyasp.net/?p=2431 CREATE TABLE [dbo].[ChangeLog]( [LogId] [int] IDENTITY(1,1) NOT NULL, [DatabaseName] [varchar] (256) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, [EventType] [varchar](50) COLLATE SQL_Latin1_

SQL Server DDL 触发器(Trigger)-- 创建数据库级别的DDL触发器

SQL Server DDL 触发器(Trigger)-- 创建数据库级别的DDL触发器 以下针对某个数据库在创建数据表时调用触发器,并将创建该数据表的用户账户写入到Windows的Event Log中. CREATE TRIGGER reminder ON DATABASE FOR CREATE_TABLE AS DECLARE @str NVARCHAR(100) SET @str=suser_sname() + N'create a new table' RAISERROR(@str,10

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

SQL Server DDL 触发器(Trigger)-- 创建服务器级别的DDL触发器 若是创建服务器级别的DDL触发器,只要把先前的ON DATABASE改为ON ALL SERVER,即可跟踪服务器级别的事件,使用的原理与数据库级别的DDL触发器相似,区别只在跟踪的事件不同. CREATE TRIGGER ddl_trig_login ON ALL SERVER FOR DDL_LOGIN_EVENTS AS PRINT n'ALTER LOGIN EVENT' SELECT EVENTD

SQL Server DDL 触发器(Trigger)-- 介绍

SQL Server DDL 触发器(Trigger)-- 介绍 触发器(Trigger)以往仅用在特定的对象上,如数据表.当数据维护语言(DML)的Insert.Delete.Update语法针对这些对象工作时,由系统自动调用对应的触发器,而在SQL Server 2000中增加了Instead of Trigger,通过触发器来取代原本要执行的添加.修改.删除语法,且可以设置在视图上.由于Instead of Trigger是在DML语法真的改变数据写入事务日志之前触发,因此,也称为Befo

存储过程版本控制-DDL触发器

参考:http://www.sqlteam.com/article/using-ddl-triggers-in-sql-server-2005-to-capture-schema-changes USE CedarLog GO CREATE TABLE [dbo].[ChangeLog]( [LogId] [INT] IDENTITY(1,1) NOT NULL, [DatabaseName] [VARCHAR](256) NOT NULL, [EventType] [VARCHAR](50)

利用Oracle DDL触发器实现DDL监控

前言 创建此触发器的主要目的是为了控制数据库的版本,虽然会将DDL语句保留但难免会出现遗漏,所以创建DDl触发器记录DDL操作,主要是用来核对数据库变更的SQL语句 创建用户并授权 #需要使用sys用户授权 CREATE USER DBADMIN IDENTIFIED BY DBADMIN; GRANT CONNECT TO DBADMIN; GRANT DBA TO DBADMIN; GRANT SYS.V_$OPEN_CURSOR TO DBADMIN; 创建序列及表 DROP SEQUEN

47. SQL- 触发器之DDL 触发器

触发器工作原理     DDL触发器 与DML 触发器不同,DDL 触发器不会为响应针对表或视图的UPDATE.INSERT或DELETE 语句而激发. 响应多种数据定义语言(DDL) 语句而激发.主要是以CREATE.ALTER和DROP 开头的语句. DDL 触发器可用于管理任务,例如审核和控制数据库操作. DDL 触发器的作用域: l 数据库作用域 l 服务器作用域 在响应当前数据库或服务器中处理的Transact-SQL 事件时,将激发DDL 触发器.触发器的作用域取决于事件(数据库作用

触发器学习(DDL触发器)

/* 创建一个触发器禁止新建对象*/ SQL> CREATE TRIGGER no_create   2    AFTER CREATE ON SCHEMA   3  BEGIN   4    RAISE_APPLICATION_ERROR(   5    -2000,   6  'ERROR:Objects cannot be created in the production database.'   7  );   8  END;   9 / Trigger created SQL> C