1

SQL Server表值函数基于<a href="https://docs.microsoft.com/en-us/azure/app-service-web/web-sites-dotnet-entity-framework-row-level-security" rel="nofollow noreferrer" title="Row level security">Row level security</a>我创建了一个表值函数执行的代码

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包含行的milions。是userAccessPredicate独立计算每行的SELECT Value FROM dbo.Values?如果是这样,我猜是无效的。如何检查执行表值函数时生成的确切代码? SQL Server Profiler不是因为我使用Azure数据库。

我正在使用SQL Server 2016 Management Studio。

+1

你有联系的物品,有一个链接到另一篇文章谈论的性能:https://blogs.msdn.microsoft.com/sqlsecurity/2015/04/23/row-level-security-性能和 - 共图案/ – Alex

回答

2

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

要回答你的问题,如果你看到的除了计划中的一个嵌套循环当政策上,则是它去行由行Nested Loops

也做同样的DBCC SHOW_STATISTICS得到看看资源命中了。对于较小的表格,我从来没有看到任何明显的性能命中,在类似的实现中有100,000行。

我发现这个链接有用的时候进入这之前。

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

相关问题