代码之家  ›  专栏  ›  技术社区  ›  db_k

SQL Server表值函数执行代码

  •  1
  • db_k  · 技术社区  · 7 年前

    基于 Row level security

    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

    1 回复  |  直到 7 年前
        1
  •  2
  •   Ollie    7 年前

    最好的方法是在策略关闭后再打开的情况下查看执行计划。您将看到它所做的额外工作。您正在添加另一个表来查询,因此它类似于执行连接,但可能更高效。

    Nested Loops

    我发现这个链接在之前的文章中很有用。

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