首页 > 解决方案 > 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 不支持?

标签: sqlsql-serverrow-level-security

解决方案


推荐阅读