SQL Server授予特定行的权限

时间:2013-12-30 01:11:51

标签: sql sql-server

我正在为一组5家公司做BI报告。由于所有公司的信息大致相同,我在一个数据库中整合5家公司的所有数据,重组重要数据,索引表(我不能在原始数据库中这样做因为ERP限制)并使用所需的所有信息创建视图。

在小组中,我有一些企业角色可以从一个视图中获取5家公司的数据,但是,我不感兴趣的是公司1的员工看到公司2的信息,而不是另一种方式。有什么方法可以将限制信息的权限授予包含特定列中员工公司名称的行?

我知道我可以使用WHERE子句复制视图并过滤信息,但我真的想避免这种情况。请帮忙。谢谢!

3 个答案:

答案 0 :(得分:3)

您所说的是行级安全性。对此产品几乎没有任何支持。

以下是一些可以使用的设计模式的文章。

http://sqlserverlst.codeplex.com/

http://msdn.microsoft.com/en-us/library/bb669076(v=vs.110).aspx

将所有公司合并到一个数据库中的目标是什么?

以下是一些想法。

1 - 单独的数据库可以更轻松地保护数据;但是,很难汇总数据。

此外,重复所有对象。

2 - 使用模式分隔数据。可以在架构级别发出安全性。

它具有相同的重复对象,少于数据库容器,但超级用户组可以查看所有模式并写入聚合报告。

我认为架构正在被DBA和开发人员使用。

3 - 编写存储过程和/或重复视图以确保安全性。虽然表没有重复,但有些代码是。

同样,这个问题没有灵丹妙药。

但是,这是一个绿色的田野项目,你可以指定你想要实施它的方式。

答案 1 :(得分:1)

从SQL Server 2016开始,专门为此问题提供支持。接受的答案中的MSDN链接已转发至the right article。尽管相关答案有所更改,但我还是决定再次发布。

您现在可以创建实现以下行级权限的安全策略(来自MSDN的代码;假定具有每个用户的权限,并在表中名为UserName的列):

CREATE SCHEMA Security
GO

CREATE FUNCTION Security.userAccessPredicate(@UserName sysname)
    RETURNS TABLE
    WITH SCHEMABINDING
AS
    RETURN SELECT 1 AS accessResult
    WHERE @UserName = SUSER_SNAME()
GO

CREATE SECURITY POLICY Security.userAccessPolicy
    ADD FILTER PREDICATE Security.userAccessPredicate(UserName) ON dbo.MyTable,
    ADD BLOCK PREDICATE Security.userAccessPredicate(UserName) ON dbo.MyTable
GO

此外,建议创建存储过程来检查访问数据的权限,这是第二层安全性,因为用户可能否则会发现有关他们无法访问的现有数据的详细信息,即尝试违反约束。有关详细信息,请参阅MSDN文章,该文章正是关于该主题的。

它也指出了旧版SQL Server的解决方法。

答案 2 :(得分:0)

如果要使用 where 子句限制视图数据,最简单的方法是创建一个视图,然后为用户分配权限。 例子:

CREATE VIEW emp AS SELECT Name, Bdate, Address FROM EMPLOYEE WHERE id=5;
GRANT SELECT ON emp TO user