关闭 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

    上一篇返回首页 下一篇

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

    别人在看

    hiberfil.sys文件可以删除吗?了解该文件并手把手教你删除C盘的hiberfil.sys文件

    Window 10和 Windows 11哪个好?答案是:看你自己的需求

    盗版软件成公司里的“隐形炸弹”?老板们的“法务噩梦” 有救了!

    帝国CMS7.5编辑器上传图片取消宽高的三种方法

    帝国cms如何自动生成缩略图的实现方法

    Windows 12即将到来,将彻底改变人机交互

    帝国CMS 7.5忘记登陆账号密码怎么办?可以phpmyadmin中重置管理员密码

    帝国CMS 7.5 后台编辑器换行,修改回车键br换行为p标签

    Windows 11 版本与 Windows 10比较,新功能一览

    Windows 11激活产品密钥收集及专业版激活方法

    IT头条

    智能手机市场风云:iPhone领跑销量榜,华为缺席引争议

    15:43

    大数据算法和“老师傅”经验叠加 智慧化收储粮食尽显“科技范”

    15:17

    严重缩水!NVIDIA将推中国特供RTX 5090 DD:只剩24GB显存

    00:17

    无线路由大厂 TP-Link突然大裁员:补偿N+3

    02:39

    Meta 千万美金招募AI高级人才

    00:22

    技术热点

    微软已修复windows 7/windows 8.1媒体中心严重漏洞 用户可下载安

    卸载MySQL数据库,用rpm如何实现

    windows 7中使用网上银行或支付宝支付时总是打不开支付页面

    一致性哈希算法原理设计

    MySQL数字类型中的三种常用种类

    如何解决SQL Server中传入select语句in范围参数

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

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