关于SQLServer2005的学习笔记——系统触发器

本文涉及的产品
云数据库 RDS SQL Server,基础系列 2核4GB
简介:
DDL  触发器是一种特殊的触发器,它在响应数据定义语言  (DDL)  语句时触发。它们可以用于在数据库 中执行管理 任务,例如,审核以及规范数据库操作。
DDL  触发器在  CREATE    ALTER    DROP  和其他  DDL  语句上操作。它们用于执行管理任务,并强制影响数据库的业务规则。它们应用于数据库或服务器 中某一类型的所有命令。
 
服务器作用域的  DDL  语句——能够审计的相关类别
 
-- 创建一张审计表,也可以为每类审计定制相关审计表
CREATE TABLE dbo.AuditEventsTable
(
         ID                        INT  NOT NULL IDENTITY,
         EventType                  SYSNAME NOT NULL,      
         PostTime          DATETIME NOT NULL,
         SPID                   SYSNAME NOT NULL,
         ServerName              SYSNAME NOT NULL,
         LoginName                SYSNAME NOT NULL,
         UserName                 SYSNAME NOT NULL,      
         DatabaseName                 SYSNAME NOT NULL,      
         SchemaName           SYSNAME NOT NULL,
         ObjectName              SYSNAME NOT NULL,
         ObjectType                SYSNAME NOT NULL,
         CommandText          SYSNAME NOT NULL,      
         EventData                 XML NOT NULL,
         Flag                    INT,
         MSG                            VARCHAR(500),
         CONSTRAINT PK_AuditDDLEvents PRIMARY KEY(ID)
);
GO 
 
 
-- 所有审计数据均存在在一个 XML 中,相关结构如下
EVENTDATA 数据构成
<EVENT_INSTANCE>
  <EventType>CREATE_TABLE</EventType>
  <PostTime>2010-03-17T15:59:46.687</PostTime>
  <SPID>57</SPID>
  <ServerName>SQLSERVER\TEST2005</ServerName>
  <LoginName>sa</LoginName>
  <UserName>dbo</UserName>
  <DatabaseName>AdventureWorks</DatabaseName>
  <SchemaName>dbo</SchemaName>
  <ObjectName>TETS</ObjectName>
  <ObjectType>TABLE</ObjectType>
  <TSQLCommand>
    <SetOptions ANSI_NULLS="ON" ANSI_NULL_DEFAULT="ON" ANSI_PADDING="ON" QUOTED_IDENTIFIER="ON" ENCRYPTED="FALSE" />
    <CommandText>CREATE TABLE TETS(AA VARCHAR(20))</CommandText>
  </TSQLCommand>
</EVENT_INSTANCE> 
 
 
-- 根据每种审计,创建相应的审计触发器,该触发器可以基于数据库也可以基于服务器
ALTER TRIGGER TRI_AUDIT_CREATE_TABLE ON DATABASE FOR CREATE_TABLE
AS
DECLARE @EventData XML;
DECLARE @ObjectName SYSNAME;
DECLARE @MSG VARCHAR(500);
 
SET @EventData=EVENTDATA();
SET @ObjectName=
@EventData.value('(/EVENT_INSTANCE/SchemaName)[1]','SYSNAME')+'.'+
@EventData.value('(/EVENT_INSTANCE/ObjectName)[1]','SYSNAME');
--此处可以进行相关审核

IF OBJECTPROPERTY(OBJECT_ID(@ObjectName),'TableHasPrimaryKey')=0
BEGIN
         SET @MSG='Table  '+@ObjectName+' does not contain a primary key, You can''t create it';
         RAISERROR(@MSG,16,1);
         ROLLBACK
/*
         INSERT INTO dbo. AuditEventsTable
         (EventType,PostTime,SPID,ServerName,LoginName,UserName,DatabaseName,
           SchemaName,ObjectName,ObjectType,CommandText,EventData,Flag,MSG
         )
         VALUES
         (
           @EventData.value('(/EVENT_INSTANCE/EventType)[1]','VARCHAR(23)'),
           @EventData.value('(/EVENT_INSTANCE/PostTime)[1]','SYSNAME'),
           @EventData.value('(/EVENT_INSTANCE/SPID)[1]','SYSNAME'),
           @EventData.value('(/EVENT_INSTANCE/ServerName)[1]','SYSNAME'),
           @EventData.value('(/EVENT_INSTANCE/LoginName)[1]','SYSNAME'),
           @EventData.value('(/EVENT_INSTANCE/UserName)[1]','SYSNAME'),
           @EventData.value('(/EVENT_INSTANCE/DatabaseName)[1]','SYSNAME'),
           @EventData.value('(/EVENT_INSTANCE/SchemaName)[1]','SYSNAME'),
           @EventData.value('(/EVENT_INSTANCE/ObjectName)[1]','SYSNAME'),
           @EventData.value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]','SYSNAME'),
           @EventData.value('(/EVENT_INSTANCE/ObjectType)[1]','SYSNAME'), 
           @EventData,
           0,
           @MSG
         );
*/
         RETURN;
END
ELSE
         -- 记录成功日志
         INSERT INTO dbo. AuditEventsTable
         (EventType,PostTime,SPID,ServerName,LoginName,UserName,DatabaseName,
           SchemaName,ObjectName,ObjectType,CommandText,EventData,Flag
         )
         VALUES
         (
           @EventData.value('(/EVENT_INSTANCE/EventType)[1]','VARCHAR(23)'),
           @EventData.value('(/EVENT_INSTANCE/PostTime)[1]','SYSNAME'),
           @EventData.value('(/EVENT_INSTANCE/SPID)[1]','SYSNAME'),
           @EventData.value('(/EVENT_INSTANCE/ServerName)[1]','SYSNAME'),
           @EventData.value('(/EVENT_INSTANCE/LoginName)[1]','SYSNAME'),
           @EventData.value('(/EVENT_INSTANCE/UserName)[1]','SYSNAME'),
           @EventData.value('(/EVENT_INSTANCE/DatabaseName)[1]','SYSNAME'),
           @EventData.value('(/EVENT_INSTANCE/SchemaName)[1]','SYSNAME'),
           @EventData.value('(/EVENT_INSTANCE/ObjectName)[1]','SYSNAME'),
           @EventData.value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]','SYSNAME'),
           @EventData.value('(/EVENT_INSTANCE/ObjectType)[1]','SYSNAME'), 
           @EventData,
           1
         );
GO 
 
 
-- 进行相关测试
create table test(a varchar(20))
SELECT * FROM dbo. AuditEventsTable 
 
 
参考:
ms-help://MS.SQLCC.v9/MS.SQLSVR.v9.zh-CHS/tsqlref9/html/27569888-f8b5-4cec-a79f-6ea6d692b4ae.htm
 
 





本文转自baoqiangwang51CTO博客,原文链接:,如需转载请自行联系原作者
相关文章
|
Java 数据库连接 数据库
JSP奖学金管理系统myeclipse开发sqlserver数据库bs框架java编程jdbc
JSP 奖学金管理系统是一套完善的web设计系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,开发环境为TOMCAT7.0,Myeclipse8.5开发,数据库为SQLSERVER2008,使用java语言开发,系统主要采用B/S模式开发。
133 0
|
27天前
|
SQL 容灾 安全
云时代SQL Server的终极答案:阿里云 RDS SQL Server如何用异地容灾重构系统可靠性
在数字化转型的浪潮中,数据库的高可用性已成为系统稳定性的生命线。作为经历过多次生产事故的资深开发者,肯定深知传统自建SQL Server架构的脆弱性——直到遇见阿里云 RDS SQL Server,其革命性的异地容灾架构彻底改写了游戏规则。
|
存储 SQL 安全
数据库SQL Server 9-10 章(存储过程与触发器)
数据库SQL Server 9-10 章(存储过程与触发器)
362 0
|
SQL Oracle 关系型数据库
数据库sqlserver-----触发器的插入,更新和删除
数据库sqlserver-----触发器的插入,更新和删除
1066 3
|
SQL 关系型数据库 数据管理
Microsoft SQL Server 是微软公司开发的一款关系型数据库管理系统
【5月更文挑战第14天】Microsoft SQL Server 是微软公司开发的一款关系型数据库管理系统
304 2
|
SQL Windows
安装SQL Server 2005时出现对性能监视器计数器注册表值执行系统配置检查失败的解决办法...
安装SQL Server 2005时出现对性能监视器计数器注册表值执行系统配置检查失败的解决办法...
122 4
|
存储 SQL
SQL Server 存储过程 触发器 事务处理
SQL Server 存储过程 触发器 事务处理
239 0
|
开发框架 前端开发 JavaScript
JavaScript云LIS系统源码ASP.NET CORE 3.1 MVC + SQLserver + Redis医院实验室信息系统源码 医院云LIS系统源码
实验室信息系统(Laboratory Information System,缩写LIS)是一类用来处理实验室过程信息的软件,云LIS系统围绕临床,云LIS系统将与云HIS系统建立起高度的业务整合,以体现“以病人为中心”的设计理念,优化就诊流程,方便患者就医。
153 0
|
存储 开发框架 前端开发
C#开发的全套成熟的LIS系统源码JavaScript+SQLserver 2012区域云LIS系统源码
医院云LIS系统是一套成熟的实验室信息管理系统,目前已在多家三级级医院应用,并不断更新。云LIS系统是为病人为中心、以业务处理为基础、以提高检验科室管理水平和工作效率为目标,将医学检验、科室管理和财务统计等检验科室/实验室所有工作进行整合,全面改善检验科室/实验室的工作现状。
114 0
|
开发框架 .NET 数据库
asp.net企业费用报销管理信息系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio
asp.net 企业费用报销管理信息系统是一套完善的web设计管理系统,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为vs2010,数据库为sqlserver2008,使 用c#语言开发 应用技术:asp.net c#+sqlserver 开发工具:vs2010 +sqlserver
189 0