sql server ddl触发器限制用户创建表

本文介绍如何使用 SQL Server DDL 触发器阻止普通用户创建名为 mystu 或 myuser 的表,通过分析事件数据并获取表名,实现数据库安全性控制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先先上代码,这个代码主要的作用是如果用户创建的表的名字不是mystu或者myuser 就阻止用户创建表
CREATE TRIGGER DDL_TableTrigger
ON DATABASE
FOR CREATE_TABLE
as
   DECLARE  @event xml 
   DECLARE @tablesname varchar(1024)
   set @event=EVENTDATA();
   set @tablesname=@event.value('(/EVENT_INSTANCE/ObjectName)[1]', 'sysname')
   if @tablesname<>'mystu' and @tablesname<>'myuser'
   begin
   PRINT 'sorry,you are not dba'
   ROLLBACK ;
   end


首先这里用了sql server的ddl触发器,这个触发器的作用是:用户增删改数据库表,数据库的时候触发的事件,并且对该事件的一个处理

这个ddl触发器建立之后会在  可编程性->数据库触发器  的下面有显示

这段代码的关键点是:获取用户将要创建数据表的表名

好在微软提供了一个函数EVENTDATA(),这个函数返回的是触发事件后的所有影响到的参数(包括影响的数据库,数据库用户,数据库表,登陆名,时间 等),这个函数的返回是xml,因为返回的是xml,所以要对xml进行解析,所幸,sql server提供一个类似于xpath的解析方式:

所以:

@event.value('(/EVENT_INSTANCE/ObjectName)[1]', 'sysname')
就能得到受影响的表名

其他的:


        @data.value('(/EVENT_INSTANCE/PostTime)[1]', 'sysname'),                 --受影响的时间
        @data.value('(/EVENT_INSTANCE/ServerName)[1]', 'sysname'),               --受影响的服务器名
        @data.value('(/EVENT_INSTANCE/LoginName)[1]', 'sysname'),                --受影响的登陆名
        @data.value('(/EVENT_INSTANCE/UserName)[1]', 'sysname'),                 --受影响的用户名
       @data.value('(/EVENT_INSTANCE/DatabaseName)[1]', 'sysname'),             --受影响的数据库名
        @data.value('(/EVENT_INSTANCE/SchemaName)[1]', 'sysname'),               ---受影响的架构名
        @data.value('(/EVENT_INSTANCE/ObjectName)[1]', 'sysname'),               ---受影响的表名
        @data.value('(/EVENT_INSTANCE/TSQLCommand)[1]', 'nvarchar(max)'),        --受影响的sql语句
        @data.value('(/EVENT_INSTANCE/EventType)[1]', 'sysname'),                --事件类型


最后的两个操作是:输出sorry,you are not dba

回滚并且阻止操作


参考http://www.cnblogs.com/gaizai/p/3473553.html

       https://msdn.microsoft.com/zh-cn/library/ms173781.aspx

       http://blog.youkuaiyun.com/tjvictor/article/details/4331788

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值