SQL 行级安全策略

问题描述 投票:0回答:1

我有一个具有以下结构的数据库:

数据:

员工 部门
1 1
2 1
3 2
4 2

用户

经理 部门
yyy 1
yyy 2
xxx 2
zz 3

经理 yyy 有权访问部门 1 或 2 的所有行。经理 xxx 有权访问部门 2 的行,zzz 有权访问部门 3 的行。

我正在尝试相应地构建功能和安全策略,但没有成功。

这个 select 语句工作正确,但我想将其实现为 RLS:

select * 
from Data as D
join Users as U on U.department = D.department
where U.manager = USER_NAME()

有人可以帮忙吗?

sql sql-server security row policy
1个回答
0
投票

您的示例数据似乎不正确匹配(我在部门 3 的

Data
中没有看到任何行,因此
yyy
返回所有行)。但这就是我认为您正在寻找的:

CREATE FUNCTION dbo.CheckManager
(
  @Department int
)
RETURNS TABLE WITH SCHEMABINDING
AS 
  RETURN
  (
    SELECT Allow = 1
      FROM dbo.Users
      WHERE Department = @Department
        AND Manager = USER_NAME()
  );
GO

CREATE SECURITY POLICY dbo.ManagersPolicy
ADD FILTER PREDICATE dbo.CheckManager(Department)
ON dbo.Data WITH (STATE = ON);
GO
© www.soinside.com 2019 - 2024. All rights reserved.