当前位置: 网学 > 编程文档 > SQL SERVER > 正文

SQL Server 2005 Beta 2 Transact-SQL 增强功能(三)

来源:Http://myeducs.cn 联系QQ:点击这里给我发消息 作者: 用户投稿 来源: 网络 发布时间: 12/10/18
下载{$ArticleTitle}原创论文样式
t_ddl_events ON DATABASE FOR DDL_DATABASE_LEVEL_EVENTS
AS
DECLARE @eventdata AS XML
SET @eventdata = eventdata()
INSERT INTO dbo.AuditDDLEvents(
posttime, eventtype, loginname, schemaname,
objectname, targetobjectname, eventdata)
VALUES(
CAST(@eventdata.query(''data(//PostTime)'') AS VARCHAR(23)),
CAST(@eventdata.query(''data(//EventType)'') AS SYSNAME),
CAST(@eventdata.query(''data(//LoginName)'') AS SYSNAME),
CAST(@eventdata.query(''data(//SchemaName)'') AS SYSNAME),
CAST(@eventdata.query(''data(//ObjectName)'') AS SYSNAME),
CAST(@eventdata.query(''data(//TargetObjectName)'') AS SYSNAME),
@eventdata)
GO

该触发器简单地使用 XQuery 从 eventdata() 函数中提取所有感兴趣的事件属性,并且将这些属性插入到 AuditDDLEvents 表中。要测试该触发器,请提交几个 DDL 语句并查询审核表:

CREATE TABLE T1(col1 INT NOT NULL PRIMARY KEY)
ALTER TABLE T1 ADD col2 INT NULL
ALTER TABLE T1 ALTER COLUMN col2 INT NOT NULL
CREATE NONCLUSTERED INDEX idx1 ON T1(col2)
SELECT * FROM AuditDDLEvents

要检查都有谁在过去 24 小时中更改了表 T1 的架构以及他们是如何更改的,请运行以下查询:

SELECT posttime, eventtype, loginname,
CAST(eventdata.query(''data(//TSQLCommand)'') AS NVARCHAR(2000))
AS tsqlcommand
FROM dbo.AuditDDLEvents
WHERE schemaname = N''dbo'' AND N''T1'' IN(objectname, targetobjectname)
ORDER BY posttime

要删除该触发器和刚刚创建的表,请运行以下代码:

DROP TRIGGER trg_audit_ddl_events ON DATABASE
DROP TABLE dbo.T1
DROP TABLE dbo.AuditDDLEvents

作为服务器级别审核触发器的示例,以下触发器审核了到达一个名为 AuditDDLLogins 的审核表的所有与 DDL 登录相关的事件:

USE master
CREATE TABLE dbo.AuditDDLLogins
(
LSN INT NOT NULL IDENTITY,
posttime DATETIME NOT NULL,
eventtype SYSNAME NOT NULL,
loginname SYSNAME NOT NULL,
objectname SYSNAME NOT NULL,
logintype SYSNAME NOT NULL,
eventdata XML NOT NULL,
CONSTRAINT PK_AuditDDLLogins PRIMARY KEY(LSN)
)
CREATE TRIGGER audit_ddl_logins ON ALL SERVER
FOR DDL_LOGIN_EVENTS
AS
DECLARE @eventdata AS XML
SET @eventdata = eventdata()
INSERT INTO master.dbo.AuditDDLLogins(
posttime, eventtype, loginname,
objectname, logintype, eventdata)

VALUES(
CAST(@eventdata.query(''data(//PostTime)'') AS VARCHAR(23)),
CAST(@eventdata.query(''data(//EventType)'') AS SYSNAME),
CAST(@eventdata.query(''data(//LoginName)'') AS SYSNAME),
CAST(@eventdata.query(''data(//ObjectName)'') AS SYSNAME),
CAST(@eventdata.query(''data(//LoginType)'') AS SYSNAME),
@eventdata)
GO

要测试该触发器,请发出下列 DDL 登录语句以创建、改变和退出登录,然后查询审核表:

CREATE LOGIN login1 WITH PASSWORD = ''123''
ALTER LOGIN login1 WITH PASSWORD = ''xyz''
DROP LOGIN login1
SELECT * FROM AuditDDLLogins

要退出该触发器和审核表,请运行以下代码:

DROP TRIGGER audit_ddl_logins ON ALL SERVER
DROP TABLE dbo.AuditDDLLogins
DROP DATABASE testdb

DDL 和系统事件通知

SQL Server 2005 Beta 2 使您可以捕获 DDL 和系统事件,并且向 Service Broker 部署发送事件通知。尽管触发器被同步处理,但事件通知是一种允许异步使用的事件传递机制。事件通知将 XML 数据发送给指定的 Service Broker 服务,而事件使用者异步使用该数据。事件使用者可以使用 WAITFOR 子句的扩展等待新数据到达。

事件通知通过下列元素定义:

网学推荐

免费论文

原创论文

浏览:
设为首页 | 加入收藏 | 论文首页 | 论文专题 | 设计下载 | 网学软件 | 论文模板 | 论文资源 | 程序设计 | 关于网学 | 站内搜索 | 网学留言 | 友情链接 | 资料中心
版权所有 QQ:3710167 邮箱:3710167@qq.com 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
Copyright 2008-2015 myeducs.Cn www.myeducs.Cn All Rights Reserved
湘ICP备09003080号