1

基于行级安全性,我创建了一个表值函数:

CREATE FUNCTION Security.userAccessPredicate(@ValueId int)
RETURNS TABLE
WITH SCHEMABINDING
AS
RETURN
(
    SELECT 1 AS accessResult
    WHERE @ValueId = 
    (
        SELECT Value 
        FROM dbo.Values 
        WHERE UserId = CAST(SESSION_CONTEXT(N'UserId') AS NVARCHAR(50))
    ) OR NULLIF(CAST(SESSION_CONTEXT(N'UserId') AS nvarchar(50)),'') IS NULL
);

CREATE SECURITY POLICY Security.userSecurityPolicy
    ADD FILTER PREDICATE Security.userAccessPredicate(ValueUd) ON dbo.MainTable

假设MainTable包含数百万行。是否独立userAccessPredicate计算SELECT Value FROM dbo.Values每一行?如果是这样,我想它是无效的。如何检查执行表值函数时生成的确切代码?SQL Server Profiler 不行,因为我使用的是 Azure DB。

我正在使用 SQL Server 2016 Management Studio。

4

1 回答 1

2

最好的方法是查看策略关闭然后打开的执行计划。因此,您会看到它所做的额外工作。您正在添加另一个表进行查询,因此它类似于进行联接,但可能更有效。

要回答您的问题,如果您在策略启用时看到计划中添加了嵌套循环,那么是的,它会逐行嵌套循环

也对 DBCC SHOW_STATISTICS 执行相同操作以查看资源命中。对于较小的表,我从未看到任何明显的性能下降,在类似的实现中 < 100,000 行。

我发现这个链接在之前进入这个时很有用。

https://www.mssqltips.com/sqlservertip/4005/sql-server-2016-row-level-security-limitations-performance-and-troubleshooting/

于 2017-07-26T10:58:57.410 回答