手机
当前位置:查字典教程网 >编程开发 >mssql数据库 >SQL Server 2008中的代码安全(二) DDL触发器与登录触发器
SQL Server 2008中的代码安全(二) DDL触发器与登录触发器
摘要:本文主要涉及DDL触发器和登录触发器的应用实例。MicrosoftSQLServer提供两种主要机制来强制使用业务规则和数据完整性:约束和触...

本文主要 涉及DDL触发器和登录触发器的应用实例。

MicrosoftSQL Server 提供两种主要机制来强制使用业务规则和数据完整性:约束和触发器。触发器为特殊类型的存储过程,可在执行语言事件时自动生效。SQL Server 包括三种常规类型的触发器:DML 触发器、DDL 触发器和登录触发器。

1、当数据库中发生数据操作语言 (DML) 事件时将调用 DML 触发器。DML 事件包括在指定表或视图中修改数据的 INSERT 语句、UPDATE 语句或 DELETE 语句。DML 触发器可以查询其他表,还可以包含复杂的 Transact-SQL 语句。将触发器和触发它的语句作为可在触发器内回滚的单个事务对待。如果检测到错误(例如,磁盘空间不足),则整个事务即自动回滚。

关于DML触发器应用最为广泛。这里不再赘述。MSDN官方说明:http://msdn.microsoft.com/zh-cn/library/ms189799.aspx

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

下面我们用举例说明DDL触发器(http://technet.microsoft.com/zh-cn/library/ms189799%28SQL.90%29.aspx)的应用:

示例一:创建一个DDL触发器审核数据库级事件

复制代码 代码如下:

/***************

创建一个审核表,其中EventData是一个XML数据列

3w@live.cn

*******************/

USE master

GO

CREATE TABLE dbo.ChangeAttempt

(EventData xml NOT NULL,

AttemptDate datetime NOT NULL DEFAULT GETDATE(),

DBUser char(50) NOT NULL)

GO

/***************

在目标数据库上创建一个触发器,以记录该数据库的索引变化动作,

包括Create|alter|Drop

3w@live.cn

*******************/

CREATE TRIGGER db_trg_RestrictINDEXChanges

ON DATABASE

FOR CREATE_INDEX, ALTER_INDEX, DROP_INDEX

AS

SET NOCOUNT ON

INSERT dbo.ChangeAttempt

(EventData, DBUser)

VALUES (EVENTDATA(), USER)

GO

/***************

创建一个索引,以测试触发器

3w@live.cn

*******************/

CREATE NONCLUSTERED INDEX ni_ChangeAttempt_DBUser ON

dbo.ChangeAttempt(DBUser)

GO

/***************

查看审核记录

3w@live.cn

*******************/

SELECT EventData

FROM dbo.ChangeAttempt

--------/***************

--------删除测试触发器和记录表

--------3w@live.cn

--------*******************/

----drop TRIGGER [db_trg_RestrictINDEXChanges]

----ON DATABASE

----go

----drop table dbo.ChangeAttempt

----go

执行结果:

SQL Server 2008中的代码安全(二) DDL触发器与登录触发器1

示例二:创建一个DDL触发器审核服务器级事件

复制代码 代码如下:

--------/***************

--------在目标数据库服务器上创建一个触发器,以防止添加登录账号,

--------3w@live.cn

--------*******************/

USE master

GO

-- Disallow new Logins on the SQL instance

CREATE TRIGGER srv_trg_RestrictNewLogins

ON ALL SERVER

FOR CREATE_LOGIN

AS

PRINT 'No login creations without DBA involvement.'

ROLLBACK

GO

--------/***************

--------试图创建一个登录账号

--------3w@live.cn

--------*******************/

CREATE LOGIN johny WITH PASSWORD = '123456'

GO

--------/***************

--------删除演示触发器

--------3w@live.cn

--------*******************/

drop TRIGGER srv_trg_RestrictNewLogins

ON ALL SERVER

go

效果:

SQL Server 2008中的代码安全(二) DDL触发器与登录触发器2

注意:要特别谨慎使用DDL触发器。如果设置不当,将会在数据库级甚至服务器级引发不可预知的后果。

3、登录触发器(http://msdn.microsoft.com/zh-cn/library/bb326598.aspx)将为响应 LOGON 事件而激发存储过程。与 SQL Server 实例建立用户会话时将引发此事件。

如果你有这样的需求:在某个特定的时间只允许某个账号登录服务器(如单位和家里使用不同的账号远程登录服务器),那么登录触发器是一个不错的选择。

示例三:创建一个登录触发器审核登录事件

复制代码 代码如下:

--------/***************

--------创建登录账号

--------3w@live.cn

--------*******************/

CREATE LOGIN nightworker WITH PASSWORD = '123b3b4'

GO

--------/***************

--------演示数据库和审核表

--------3w@live.cn

--------*******************/

CREATE DATABASE ExampleAuditDB

GO

USE ExampleAuditDB

GO

CREATE TABLE dbo.RestrictedLogonAttempt

(LoginNM sysname NOT NULL,

AttemptDT datetime NOT NULL)

GO

--------/***************

--------创建登录触发器,如果不是在7:00-17:00登录,则记录审核日志,并提示失败

--------3w@live.cn

--------*******************/

USE master

GO

Create TRIGGER trg_logon_attempt

ON ALL SERVER

WITH EXECUTE AS 'sa'

FOR LOGON

AS

BEGIN

IF ORIGINAL_LOGIN()='nightworker' AND

DATEPART(hh,GETDATE()) BETWEEN 7 AND 17

BEGIN

ROLLBACK

INSERT ExampleAuditDB.dbo.RestrictedLogonAttempt

(LoginNM, AttemptDT)

VALUES (ORIGINAL_LOGIN(), GETDATE())

END

END

GO

--------/***************

--------查看审核记录

--------3w@live.cn

--------*******************/

USE ExampleAuditDB

GO

select * from dbo.RestrictedLogonAttempt

go

--------/***************

--------删除演示数据库及演示触发器

--------3w@live.cn

--------*******************/

use master

go

drop TRIGGER trg_logon_attempt

ON ALL SERVER

go

drop database ExampleAuditDB

go

结果:

SQL Server 2008中的代码安全(二) DDL触发器与登录触发器3

SQL Server 2008中的代码安全(二) DDL触发器与登录触发器4

当然,你也可以使用应用程序或类似于log4net的日志机制记录类似的登录事件,但SQL server 2008已经为我们做到了,你所做的仅仅是有勇气来试一试。

小结:作为对数据DDL操作和登录事件的审核和监控,SQL Server提供了比较完善的事件处理机制。这也是SQL server安全机制的一部分。下文将涉及SQL server数据库级的透明加密,敬请关注。

http://www.cnblogs.com/downmoon

【SQL Server 2008中的代码安全(二) DDL触发器与登录触发器】相关文章:

SQLServer 2008中通过DBCC OPENTRAN和会话查询事务

SQL server 视图(view)介绍

SQL Server 触发器 表的特定字段更新时,触发Update触发器

SQL Server 2008中的FileStream介绍

SQL Server 2005中更改sa的用户名的方法

SQL Server中网络备份一例

SQLServer2008安装程序失败原因一

SQL Server 2000中的触发器使用

SQL Server 2008 新特性 总结复习(一)

SQL SERVER 2008 64位系统无法导入ACCESS/EXCEL怎么办

精品推荐
分类导航