基于行级安全性,我创建了一个表值函数:
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。