e股脑电脑教程网
  • 首 页
  • 操作系统
  • 应用软件
  • 下载工具
  • 影音视频
  • 办公软件
  • 媒体制作
  • 网站建设
  • 平面设计
  • 数据库
  • 程序开发
  • 视频教程
编辑推荐: | 文章搜索:
您现在的位置: e股脑 >> 数据库 >> Mssql教程 >> SQL Server 2005 Beta 2 Transact-SQL 增强功能 2 >> 教程正文
 
教程搜索
 
 
相关教程
  • 你知道MySQL10条鲜为人知的技巧吗?
  • 你应该知道的10个MySQL客户启动选项
  • 用特殊的MySQL运算符获得更多数据比较
  • MySQL数据库中与 NULL值有关的几个问题
  • 教你快速了解公共MySQL的数据库服务器
  • MySQL 5.0在windows上的安装详细介绍
  • MySQL查询的性能优化
  • Linux操作系统中如何安装MySQL数据库
  • 23道安全门加铸MySQL数据库
  • MySQL 5.0 数据库新特性的存储过程
  • 从Windows命令行启动MySQL
  • 连接MySQL数据库失败频繁的原因
  • 加速动态网站 MySQL索引分析和优化
  • 轻松掌握如何保护MySQL中的重要数据
  • 快速掌握MySQL数据库中Show命令的用法
  • MySQL数据库的安全配置实用技巧
 
 

图文教程


  • Windows抢了谁的饭碗 非主流操作系统To

  • 地球还是火星 平常心看“非主流”

  • 综合运用Office 2007批量制作奖状

  • 没有系统盘如何才能修复受损系统?

  • 巧妙运用Excel中边界的附加功能!
 
 
赞 助 商
 
 
SQL Server 2005 Beta 2 Transact-SQL 增强功能 2
  • 来源:e股脑
  • 点击次数:
  • 更新时间:2007-8-9
提取架构和对象名称,并且使用 OBJECTPROPERTY 函数检查该表是否包含主键。如果不包含,则该触发器会生成错误并回滚事务。在创建该触发器之后,以下创建不带主键的表的尝试将失败:

CREATE TABLE T1(col1 INT NOT NULL) Msg 50000, Level 16, State 1, Procedure trg_create_table_with_pk, Line 19 Table [dbo].[T1] does not contain a primary key. Table creation rolled back. Msg 3609, Level 16, State 2, Line 1 Transaction ended in trigger. Batch has been aborted.

而以下尝试将成功:

CREATE TABLE T1(col1 INT NOT NULL PRIMARY KEY)

要删除该触发器和表 T1 ,请运行以下代码:

DROP TRIGGER trg_create_table_with_pk ON DATABASE DROP TABLE T1

作为审核触发器的示例,以下数据库级别触发器针对 AuditDDLEvents 表审核所有 DDL 语句:

CREATE TABLE AuditDDLEvents ( LSN INT NOT NULL IDENTITY, posttime DATETIME NOT NULL, eventtype SYSNAME NOT NULL, loginname SYSNAME NOT NULL, schemaname SYSNAME NOT NULL, objectname SYSNAME NOT NULL, targetobjectname SYSNAME NOT NULL, eventdata XML NOT NULL, CONSTRAINT PK_AuditDDLEvents PRIMARY KEY(LSN) ) GO CREATE TRIGGER trg_audit_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 子句的扩展等待新数据到达。

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

•

范围(SERVER、DATABASE、ASSEMBLY、单个对象)

•

事件或事件组的列表(例如,CREATE_TABLE、DDL_EVENTS 等等)

•

实现 SQL Server Events 消息类型和协定的部署名称

事件数据是使用 SQL Server Events 架构以 XML 格式发送的。用于创建事件通知的常规语法是:

CREATE EVENT NOTIFICATION <name> ON <scope> FOR <list_of_event_or_event_groups> TO SERVICE <deployment_name>

当事件通知被创建时,会在系统部署和由用户指定的部署之间建立 Service Broker 对话。 指定相应的 Service Broker,以便 SQL Server 为其打开对话以传递有关事件的数据。指定的部署必须实现 SQL Server Events 消息类型和协定。当发生存在相应的事件通知的事件时,会根据有关的事件数据构建一个 XML 消息,并且通过该事件通知的对话将其发送到指定的部署。

例如,以下代码创建了一个名为 T1 的表,并且定义了一个事件通知,以便每当 T1 表的架构改变时向特定的部署发送通知:

CREATE TABLE dbo.T1(col1 INT); GO -- Create a queue. CREATE QUEUE SchemaChangeQueue; GO --Create a service on the queue that references --the event notifications conract. CREATE SERVIC

 << 上一页  11 12 下一页
  • 上一篇教程: SQL Server 2005 中的分区表和索引
  • 下一篇教程: 在 SQL Server 2005 Beta 2 中编辑 Transact-SQL 代码
  •  

    关于本站 | 广告联系 | 版权声明 | 使用帮助

    Copyright © 2004-2008 www.egunao.com All rights reserved.