我在SQL中创建一个用户,我希望只对我的数据库中的4个表进行读/写访问:
CREATE LOGIN MyUser
WITH PASSWORD = 'xyqe123';
USE [EODB];
GO
CREATE USER MyUser FOR LOGIN MyUser;
GO
现在通过使用(强力有点),简化,成本无效的方法我定义:
GRANT select,insert,update,delete ON [MyDB].[dbo].[t1] TO [MyUser]
GO
GRANT select,insert,update,delete ON [MyDB].[dbo].[t2] TO [MyUser]
GO
GRANT select,insert,update,delete ON [MyDB].[dbo].[t3] TO [MyUser]
GO
GRANT select,insert,update,delete ON [MyDB].[dbo].[t4] TO [MyUser]
GO
Deny select,insert,update,delete ON [MyDB].[dbo].[t5] TO [MyUser]
GO
Deny select,insert,update,delete ON [MyDB].[dbo].[t6] TO [MyUser]
GO
Deny select,insert,update,delete ON [MyDB].[dbo].[t7] TO [MyUser]
GO
.......
.......///continues for 14 more tables
以上内容满足了我的需求,但提到的却是#34;愚蠢的"。我尝试的是将[MyUser]设置为[denydatareader]
和[denydatawriter]
模式,并在授予4个表的权限后,但它没有工作。
我的问题是如何使用尽可能少的陈述来实现我的目标?
答案 0 :(得分:1)
不要将用户添加到datareader
或denydatareader
等组,而只需使用前4个语句。只要您没有将用户添加到任何组,用户将被限制为这4个表。
GRANT select,insert,update,delete ON [MyDB].[dbo].[t1] TO [MyUser]
GO
GRANT select,insert,update,delete ON [MyDB].[dbo].[t2] TO [MyUser]
GO
GRANT select,insert,update,delete ON [MyDB].[dbo].[t3] TO [MyUser]
GO
GRANT select,insert,update,delete ON [MyDB].[dbo].[t4] TO [MyUser]
答案 1 :(得分:1)
首先,我建议您考虑使用自定义数据库角色。根据用户的“逻辑角色”创建逻辑角色。如果您的应用程序基于Active Directory priv。 (即集成登录) - 这确实是一个AD域问题。否则,您只需为数据库用户添加/删除角色即可。
然后,您可以在基础表,视图等上授予角色。
如果问题很简单,我如何简单地在14个不同的表上授予角色,在此上下文中使用动态sql没有任何错误。滚动你自己的例程,授予1个表的角色(传入名称),然后调用它14次。