sql server ddl触发器限制用户创建表
2016-05-12 01:44
246 查看
首先先上代码,这个代码主要的作用是如果用户创建的表的名字不是mystu或者myuser 就阻止用户创建表
首先这里用了sql server的ddl触发器,这个触发器的作用是:用户增删改数据库表,数据库的时候触发的事件,并且对该事件的一个处理
这个ddl触发器建立之后会在 可编程性->数据库触发器 的下面有显示
这段代码的关键点是:获取用户将要创建数据表的表名
好在微软提供了一个函数EVENTDATA(),这个函数返回的是触发事件后的所有影响到的参数(包括影响的数据库,数据库用户,数据库表,登陆名,时间 等),这个函数的返回是xml,因为返回的是xml,所以要对xml进行解析,所幸,sql server提供一个类似于xpath的解析方式:
所以:@event.value('(/EVENT_INSTANCE/ObjectName)[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.csdn.net/tjvictor/article/details/4331788
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.csdn.net/tjvictor/article/details/4331788
相关文章推荐
- MOS(Doc ID 1029252.6)最佳实践
- CentOS下安装phpredis扩展
- Nosql 之 Redis(可做缓存 )
- MySQL数据库权限参考
- CentOS7/RHEL7安装Redis步骤详解
- 分布式缓存之 memcache 实现分布式缓存
- 跟我一起学习MySQL技术内幕(第五版):(第三章学习日记5)
- mysql数据库实现CURD操作
- mysql基本功能
- 2016-04-04-Ejabberd-configure-db-postgresql
- win8.1安装mongodb
- 使用phpexcel类实现excel导入mysql数据库功能(实例代码)
- SQL恢复master数据库方法 只有mdf文件的数据库如何恢复
- SQL Server阻止保存修改表结构的解决方法
- Ubuntu 14.04下mysql安装配置教程
- SQL查询语句行转列横向显示实例解析
- SQLJoin连接详解
- mysql found_row()使用详解
- 图文详解Ubuntu下安装配置Mysql教程
- Ubuntu下mysql安装和操作图文教程