授予对 SQL 数据库的权限
Posted
技术标签:
【中文标题】授予对 SQL 数据库的权限【英文标题】:Giving permissions on SQL database 【发布时间】:2015-04-24 23:15:27 【问题描述】:我正在为一些新开发人员配置数据库用户,我遇到了一些困难,因为我阅读了很多文章,但对我来说效果不太好。我已经手动和使用 T-SQL 尝试了各种配置,但我需要一种更有效的方法。
我的目标:
我可以启动一些 TSQL 来授予数据库用户以下权限:
授予执行数据库中所有存储过程的权限 拒绝查看所有这些存储过程的定义的权限 授予数据库中所有表的 SELECT、UPDATE、INSERT、DELETE 权限 拒绝查看数据库中所有表的定义的权限(我不希望他们查看数据)我尝试过的:
我已经手动实现了这一点,但我有 200 多个存储过程和 100 多个表,所以我不想手动完成。从 T-SQL 方面,我设法使以下工作:
USE database_name;
GRANT EXECUTE TO [security_account];
这有效并允许用户运行存储过程,但他们无法查看实际的查询代码。我需要与上述表格相同的逻辑。
感谢您的帮助。
【问题讨论】:
当您说您不希望他们查看数据时,您的意思是您不希望他们查看架构吗?否则授予他们select
毫无意义。
@TZHX 我并没有真正考虑过。有没有办法让存储过程选择但停止用户?我没想到他们可以在应用程序中编写自己的查询并选择他们想要的所有数据
如果用户有权执行存储过程,则存储过程中的任何内容都会运行,但并不意味着用户有权在存储过程之外执行此操作(存储过程执行的那些操作)。
@TZHX 我找到了解决这个问题的方法。我允许用户执行存储,但我作为有权选择/更新等的不同用户执行存储过程。这是因为存储过程是动态的。您如何看待这个解决方案?
如果您只想更改所有表的权限,那么文档不太完整且已知的 sys 过程 sp_MSforeachtable 可能会成功: exec sp_MSforeachtable 'grant select, insert, update, delete on ?公开; '
【参考方案1】:
我不太确定这是否可以解决您的问题。但也许它至少会让你更接近你想要的。所以,这是我建议的设置:
-
不要授予任何人对任何表的任何权限。
为 DML 使用存储过程。
将所有这些存储过程的执行权限公开。
在您的数据库中设置一个表,其中列出了所有有权访问您的数据库的用户,包括他们的登录名 (suser_sname()) 和他们的权限(例如 MayAlterTableUsers)。
在所有存储过程中实现与此类似的检查
if ( select isnull(MayAlterTableUsers, 0) from tblUsers where LoginName = suser_sname() ) > 0 begin select N'Implementing the requested changes to tblUsers.' end else begin select N'You don''t have the required permission.' end
-
设置您的类似视图并将所有视图的选择权限授予公众
create view vShowAllUsers as select * from dbo.tblUsers cross apply ( select MaySeeAllUsers from dbo.tblUsers where LoginName = suser_sname() ) as p where p.MaySeeAllUsers = 1
最终,所有视图和所有存储过程都将公开可用,但权限的处理将在每个视图中进行。所有权限本身都将在此表 tblUsers 中。由于没有人可以更改此表 tblUsers,除非(当然)他们在此表中并具有适当的权限,因此此数据库设置是自包含的。
【讨论】:
以上是关于授予对 SQL 数据库的权限的主要内容,如果未能解决你的问题,请参考以下文章
授予对数据库的 SQL Server 登录访问权限 - SQL Server
SQL Server - 授予对所有现有和未来数据库的读取访问权限的登录权限