授予对特定表的访问权限的最佳实践,SQL

授予对特定表的访问权限的最佳实践,SQL,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我在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

我在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
以上这些都满足了我的需要,但正如我所说的,这是相当“愚蠢”的。我尝试的是将[MyUser]设置为
[denydatareader]
[denydatawriter]
模式,然后授予这4个表的权限,但没有成功


我的问题是如何尽可能少地使用语句来实现我的目标?

而不是将用户添加到组中,如
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] 

首先,我建议您考虑使用自定义数据库角色。根据用户的“逻辑角色”创建逻辑角色。如果你的应用程序是基于Active Directory priv(即集成登录)的,那么这确实是一个广告领域的问题。否则,您可以为数据库用户添加/删除简单的角色

然后授予基础表、视图等的角色


如果您的问题很简单,我如何简单地在14个不同的表上授予角色,那么在这种上下文中使用动态sql并没有什么错。滚动您自己的例程,为1个表授予角色(输入名称),然后调用14次。

作为替代方法,您可以始终创建可以访问这4个表的组,只需将用户添加到该组中即可。