随笔 - 74  文章 - 0  评论 - 94  阅读 - 12万

怎样给某一用户创建视图的最小权限

问题:

今天群里有位同学提问:我怎样可以给某一用户在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;
复制代码

 

posted on   万剑齐发  阅读(1913)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示