SQL Server 提供了关于触发器事件作为非强类型的XML的信息。它可以通过一个叫做EVENTDATA()的新的输出XML的内置功能来实现。你可以使用XQuery表达式来解析EVENTDATA() XML ,以便能够发现像schema名称、目标对象名称、用户名称还有触发触发器的整个Transact-SQL DDL语句等的事件属性。
数据库级别的DDL触发器触发于数据库级别和之下的DDL语言事件。例如CREATE_TABLE、ALTER_USER 等等。服务器级别的DDL触发器触发于服务器级别的DDL语言事件,例如CREATE_DATABASE、ALTER_LOGIN等等。为了管理方便,你可以使用事件组,像DDL_TABLE_EVENTS作为所有CREATE_TABLE、ALTER_TABLE和DROP_TABLE事件的总的简称。这些广泛的DDL事件组和事件类型,以及它们所关联的XML EVENTDATA(),在SQL Server 在线书籍中有描述。
和DML触发器的名称不一样,DML触发器的名称是schema 范围的,而DDL触发器名称是数据库范围的或服务器范围的。
使用这个新的目录视图来找出用于DML触发器和数据库级别的DDL触发器的触发器元数据:
以下是引用片段: SELECT * FROM sys.triggers ; GO |
如果parent_class_desc 字段具有一个‘DATABASE’值,那么它是一个DDL触发器,并且名称是数据库本身范围内的。Transact-SQL 触发器的代码体在sys.sql_modules 目录视图中可以看到,你可以将它连接到sys.triggers 的object_id 字段上。关于一个CLR触发器的元数据可以在sys.assembly_modules 目录视图中看到,你可以将它连接到sys.triggers的object_id字段上。
使用目录视图来找出服务器范围的DDL触发器的元数据:
以下是引用片段: SELECT * FROM sys.server_triggers ; GO |
Transact-SQL 服务器级别的触发器的代码体可以在sys.server_sql_modules 目录视图中看到,你可以将它连接到sys.server_triggers的object_id字段上。关于一个CLR服务器级别的触发器的元数据可以在sys.server_assembly_modules目录视图中找到,你可以将它连接到sys.server_triggers的object_id字段上。
你可以使用DDL触发器来捕捉和审查数据库中的DDL活动。创建一个具有非强类型的XML字段的审查表。为DDL事件或你感兴趣的事件组创建一个EXECUTE AS SELF DDL 触发器。这个DDL触发器的代码体可以简单地将EVENTDATA() XML插入到审查表中。
DDL触发器的另一个有趣的使用是触发于CREATE_USER 事件然后添加代码到自动权限管理中去。例如,假设你想让所有的数据库用户获得一个对存储过程P1、P2和P3的GRANT EXECUTE 权限。DDL触发器可以从EVENTDATA() XML中提取用户名称,动态地生成一个语句,像‘GRANT EXECUTE ON P1 TO someuser’,然后对它EXEC()。
7. 总结
SQL Server 2008提供了丰富的安全特性来保护数据和网络资源。它能够更容易地安全安装,因为除了最根本的特性之外,其它的都不是默认安装的或者是它们安装了但是是没有打开的。SQL Server提供了丰富的工具来配置服务器,特别是SQL Server Surface Area Configuration Tool,它的验证特性更强了,因为SQL Server与Windows验证更紧密地集成在一起,并保护脆弱的或是久远的密码。授予和控制一个用户通过验证之后可以做什么具有了更细粒度的权限、SQL Server Agent代理和执行上下文,从而变得更加灵活了。甚至是元数据都更加安全了,因为系统元数据视图只返回了关于该用户在某种形式下具有对其的权限的对象的信