怎样给某一用户创建视图的最小权限
2015-07-01 16:20
246 查看
问题:
今天群里有位同学提问:我怎样可以给某一用户在dbo架构中创建视图的最小权限?
-------------------------------------------------------------------------------------------
第一想法很简单无非是:
但事实是,如果仅仅这样授权,该用户会收到这样的错误信息:
消息 2760,级别 16,状态 1,过程 V_TEST,第 9 行
The specified schema name "dbo" either does not exist or you do not have permission to use it.
错误的原因是该用户没有修改架构的权限.于是添加修改dbo架构的授权:
这次创建视图执行成功了.
但新的问题来了.由于用户拥有了修改dbo架构的权限,用户也就有了修改表/视图/存储过程/函数等的权限
,甚至拥有了删除这些对象的权限,通过刚才的授权,下面的语句就能执行成功:
要命的是,我们不能简单通过授权来禁止用户在某一架构下所有对象的删除和修改权限。
-------------------------------------------------------------------------------------------
最终解决方案:使用数据库级别的DDL触发器来取消某一角色用户的删除/修改相关对象的事物。
今天群里有位同学提问:我怎样可以给某一用户在dbo架构中创建视图的最小权限?
-------------------------------------------------------------------------------------------
第一想法很简单无非是:
CREATE ROLE MyRole; GO GRANT CREATE VIEW TO MyRole; GO CREATE USER MyUser WITHOUT LOGIN; GO EXEC sp_addrolemember 'MyRole', 'MyUser'; GO EXECUTE AS USER = 'MyUser'; GO CREATE VIEW dbo.V_TEST AS SELECT 1 AA GO REVERT GO
但事实是,如果仅仅这样授权,该用户会收到这样的错误信息:
消息 2760,级别 16,状态 1,过程 V_TEST,第 9 行
The specified schema name "dbo" either does not exist or you do not have permission to use it.
错误的原因是该用户没有修改架构的权限.于是添加修改dbo架构的授权:
GRANT ALTER ON SCHEMA::dbo TO MyRole; GO CREATE VIEW dbo.V_TEST AS SELECT 1 AA GO REVERT GO
这次创建视图执行成功了.
但新的问题来了.由于用户拥有了修改dbo架构的权限,用户也就有了修改表/视图/存储过程/函数等的权限
,甚至拥有了删除这些对象的权限,通过刚才的授权,下面的语句就能执行成功:
EXECUTE AS USER = 'MyUser'; GO ALTER TABLE dbo.MyTable ADD AnotherID INT NULL; GO REVERT; GO EXECUTE AS USER = 'MyUser'; GO DROP TABLE dbo.MyTable; GO REVERT; GO
要命的是,我们不能简单通过授权来禁止用户在某一架构下所有对象的删除和修改权限。
-------------------------------------------------------------------------------------------
最终解决方案:使用数据库级别的DDL触发器来取消某一角色用户的删除/修改相关对象的事物。
CREATE TRIGGER [trig_db_BlockDropObjcect] ON DATABASE FOR DROP_TABLE,DROP_VIEW,DROP_PROCEDURE,DROP_FUNCTION,DROP_CONTRACT,DROP_DEFAULT,DROP_SYNONYM,DROP_TYPE ,ALTER_TABLE,ALTER_PROCEDURE,ALTER_FUNCTION AS BEGIN IF IS_MEMBER('MyRole') = 1 BEGIN PRINT 'You are not authorized to alter or drop this object.'; --仅保留修改视图权限 ROLLBACK TRANSACTION; END; END;
相关文章推荐
- 开发细节总结
- Linux笔记:iptables配置实例
- (三)html5的结构
- WiredTiger的一些特性
- 谈高端内存和低端内存
- 不能使用虚函数有哪些情况
- js 原型链
- Android开发之小知识记录-----gridview\listview选择固定位置无效解决方案
- SpringMVC集中传参方式
- iOS开发笔记---objective-c宏定义
- 【转】如何测试CTS4.0 -- 不错
- SQL语句
- OSI参考模型中各层的作用及协议
- UITextField详解
- mysqlnd cannot connect to MySQL 4.1+ using the old insecure authentication
- iOS:KVO的概述与使用
- LeetCode Triangle
- 解决tomcat一闪而过(转)
- Python metaclasses
- Linux命令之目录与路径