从SQL Server中选择数据子集的正确而安全的方法

时间:2013-08-06 11:58:53

标签: sql sql-server permissions schema

计划任务通过命令行脚本进行地理编码,因此需要访问存储在Microsoft SQL Server中的某些数据(地址编码地址)。

此数据属于架构 A ,由多个表格中的数据组成。

我想过

  • 创建sql server登录,架构和用户 B
  • 创建视图 A.VIEW1 A.TABLE_X A.TABLE_Y
  • 中进行选择
  • 授予 A.VIEW1 B
  • SELECT 权限

由于视图引用了其他表格,因此从 A.VIEW1 中选择 B 会引发权限错误:

  

对象' A.TABLE_X ',数据库'...',架构'...'的SELECT权限被拒绝。

A.TABLE_X A.TABLE_Y ,...... B 还有GRANT SELECT的替代品吗? 因为如果我这样做, B 可以从那些表中读取所有数据,不是吗?

我不希望 B 能够这样做,因为 B 的sql server凭据将以明文形式存储在文件系统或任务计划程序中。 (任何其他选择?)

A.TABLE_X A.TABLE_Y 包含与客户相关的数据,如银行帐号等。 我可以将GRANT限制为特定列,但我仍然不喜欢这个想法。

另一种方法是使用存储的proc A.PROC_FILL 填充临时表,但是将EXEC授予 B 也是不够的,是吗?

1 个答案:

答案 0 :(得分:0)

如果您将exec存储过程reportproc的权限授予用户report_user,则默认情况下,用户将能够使用创建者的权限运行该过程并查看结果无需基础表的权限。

该程序可能只是select,而不是填表。

create proc reportproc as
begin
    select * from a.table_x inner join a.table_y on tablex.id = table_y.id
end
go
grant exec on reportproc to reportuser

对于来自不同模式的表的视图,情况稍微复杂一些。见http://msdn.microsoft.com/en-us/library/ms188676.aspx