加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

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

发布时间:2020-12-12 15:23:32 所属栏目:MsSql教程 来源:网络整理
导读:DDL 触发器是一种特殊的触发器,它在响应数据定义语言 (DDL) 语句时触发。它们可以用于在数据库 中执行管理 任务,例如,审核以及规范数据库操作。 DDL 触发器在 CREATE 、 ALTER 、 DROP 和其他 DDL 语句上操作。它们用于执行管理任务,并强制影响数据库的

DDL 触发器是一种特殊的触发器,它在响应数据定义语言 (DDL) 语句时触发。它们可以用于在数据库 中执行管理 任务,例如,审核以及规范数据库操作。

DDL 触发器在 CREATE 、 ALTER 、 DROP 和其他 DDL 语句上操作。它们用于执行管理任务,并强制影响数据库的业务规则。它们应用于数据库或服务器 中某一类型的所有命令。

?

数据库作用域的 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]',

?????????? @EventData.value('(/EVENT_INSTANCE/ServerName)[1]',

?????????? @EventData.value('(/EVENT_INSTANCE/LoginName)[1]',

?????????? @EventData.value('(/EVENT_INSTANCE/UserName)[1]',

?????????? @EventData.value('(/EVENT_INSTANCE/DatabaseName)[1]',

?????????? @EventData.value('(/EVENT_INSTANCE/SchemaName)[1]',

?????????? @EventData.value('(/EVENT_INSTANCE/ObjectName)[1]',

?????????? @EventData.value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]',

?????????? @EventData.value('(/EVENT_INSTANCE/ObjectType)[1]',?

?????????? @EventData,

?????????? 0,

?????????? @MSG

???????? );

*/

???????? RETURN;

END

ELSE

???????? -- 记录成功日志

???????? INSERT INTO dbo. AuditEventsTable

???????? (EventType,Flag

???????? )

???????? VALUES

???????? (

?????????? @EventData.value('(/EVENT_INSTANCE/EventType)[1]',

?????????? 1

???????? );

GO
?

?

-- 进行相关测试

create table test(a varchar(20))

SELECT * FROM dbo. AuditEventsTable
?

?

参考:

?

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/baoqiangwang/archive/2010/03/18/5391297.aspx

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读