sql - SQL Server 行级安全性不适用于外键
问题描述
我确实有一个 Azure SQL 数据库正在运行。在那里我确实有 3 张桌子
- 用户
- 用户项目
- 项目
正常的多对多关系。一个用户可以有多个项目,一个项目可以有多个用户。这些行由 ID 链接,并相应地设置 ForeignKey-Constraitns。
我确实想为项目表启用行级安全性。这就是我所做的:
CREATE FUNCTION dbo.fn_predicate(@tenant varchar(25))
RETURNS TABLE
WITH SCHEMABINDING
AS
RETURN SELECT 1 AS fn_accessResult
WHERE SESSION_CONTEXT(N'Tenant') = @tenant ;
GO
然后我创建了策略:
CREATE SECURITY POLICY mandantPolicy
ADD FILTER PREDICATE dbo.fn_predicate(Tenant) ON dbo.Projects,
ADD BLOCK PREDICATE dbo.fn_predicate(Tenant) ON dbo.Projects
GO
然后我启用了该策略,它工作正常。这意味着我只能看到我为其设置了 SESSION_CONTEXT 的租户的项目。并且插入也被相应地阻止..
例如:
-- Works as expected (new project inserted)
EXEC SP_SET_SESSION_CONTEXT @key=N'Tenant', @value='foo'
INSERT INTO Projects (Name, Tenant) VALUES ('Dummy', 'foo')
-- Works as expected (insert blocked)
EXEC SP_SET_SESSION_CONTEXT @key=N'Tenant', @value='bar'
INSERT INTO Projects (Name, Tenant) VALUES ('Dummy', 'foo')
我期望的是,这种行级别的安全性也在关系表 UserProject 上强制执行。例如:
-- Insert a new project for tenant 'foo'
-- This results in a new project with id 1
EXEC SP_SET_SESSION_CONTEXT @key=N'Tenant', @value='foo'
INSERT INTO Projects (Name, Tenant) VALUES ('Dummy', 'foo')
-- Try to link the project from tenant foo with a user (id 5) but as tenant 'bar'
EXEC SP_SET_SESSION_CONTEXT @key=N'Tenant', @value='bar'
INSERT INTO UserProject (ProjectId, UserId) VALUES (1, 5)
在我看来,最后一个 INSERT 应该被阻止,因为租户设置为“bar”,因此之前添加为租户“foo”的项目不应该对用户“bar”可见。
我在这里错过任何配置吗?或者这只是 RLS 不支持?
解决方案
推荐阅读
- swift - 使用 didSelect 方法在 viewDidLoad 之后在单元格中显示图像
- python - 烧瓶python中的特殊字符问题
- powershell - 调用命令 InDisconnectedSession SessionOption 和 IdleTimeout 一班
- java - 哈希字符串可排序 - 大数据
- javascript - 将正则表达式应用于 redux-form 的 Field 组件中的 TextField 组件
- javascript - React:使用 createRef 从输入中获取数据
- r - `r_make()` 和 `make()` 在 r-drake 中不一致
- powershell - 防止 PowerShell ForEach-Object 展平列表?
- laravel - 如何通过标头传递参数?
- python - 微秒如何在 datetime.timedelta 中工作?