我有一个具有以下结构的数据库:
数据:
员工 | 部门 |
---|---|
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()
有人可以帮忙吗?
您的示例数据似乎不正确匹配(我在部门 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