关闭 x
IT技术网
    技 采 号
    ITJS.cn - 技术改变世界
    • 实用工具
    • 菜鸟教程
    IT采购网 中国存储网 科技号 CIO智库

    IT技术网

    IT采购网
    • 首页
    • 行业资讯
    • 系统运维
      • 操作系统
        • Windows
        • Linux
        • Mac OS
      • 数据库
        • MySQL
        • Oracle
        • SQL Server
      • 网站建设
    • 人工智能
    • 半导体芯片
    • 笔记本电脑
    • 智能手机
    • 智能汽车
    • 编程语言
    IT技术网 - ITJS.CN
    首页 » SQL Server »浅析SQL Server 2008中的代码安全之二:DDL触发器与登录触发器

    浅析SQL Server 2008中的代码安全之二:DDL触发器与登录触发器

    2011-03-03 09:30:00 出处:ITJS
    分享

    本文主要 涉及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   

    执行结果:

    示例二:创建一个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   

    效果:

    注意:要特别谨慎使用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  

    结果:

     

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

    小结:作为对数据DDL操作和登录事件的审核和监控,SQL Server提供了比较完善的事件处理机制。这也是SQL server安全机制的一部分。

    原文出处:http://www.cnblogs.com/downmoon/archive/2011/03/01/1966670.html

    上一篇返回首页 下一篇

    声明: 此文观点不代表本站立场;转载务必保留本文链接;版权疑问请联系我们。

    别人在看

    Destoon 模板存放规则及语法参考

    Destoon系统常量与变量

    Destoon系统目录文件结构说明

    Destoon 系统安装指南

    Destoon会员公司主页模板风格添加方法

    Destoon 二次开发入门

    Microsoft 将于 2026 年 10 月终止对 Windows 11 SE 的支持

    Windows 11 存储感知如何设置?了解Windows 11 存储感知开启的好处

    Windows 11 24H2 更新灾难:系统升级了,SSD固态盘不见了...

    小米路由器买哪款?Miwifi热门路由器型号对比分析

    IT头条

    Synology 对 Office 套件进行重大 AI 更新,增强私有云的生产力和安全性

    01:43

    StorONE 的高效平台将 Storage Guardian 数据中心占用空间减少 80%

    11:03

    年赚千亿的印度能源巨头Nayara 云服务瘫痪,被微软卡了一下脖子

    12:54

    国产6nm GPU新突破!砺算科技官宣:自研TrueGPU架构7月26日发布

    01:57

    公安部:我国在售汽车搭载的“智驾”系统都不具备“自动驾驶”功能

    02:03

    技术热点

    最全面的前端开发指南

    Windows7任务栏桌面下角的一些正在运行的图标不见了

    sql server快速删除记录方法

    SQL Server 7移动数据的6种方法

    SQL Server 2008的新压缩特性

    每个Java程序员必须知道的5个JVM命令行标志

      友情链接:
    • IT采购网
    • 科技号
    • 中国存储网
    • 存储网
    • 半导体联盟
    • 医疗软件网
    • 软件中国
    • ITbrand
    • 采购中国
    • CIO智库
    • 考研题库
    • 法务网
    • AI工具网
    • 电子芯片网
    • 安全库
    • 隐私保护
    • 版权申明
    • 联系我们
    IT技术网 版权所有 © 2020-2025,京ICP备14047533号-20,Power by OK设计网

    在上方输入关键词后,回车键 开始搜索。Esc键 取消该搜索窗口。