SQL Server 2016 支持行级安全性,这很棒。但是,所有示例都假定用户名位于您希望对其应用安全性的表中(参见下面的示例 - 来自 MSDN https://msdn.microsoft.com/en-us/library/dn765131.aspx)。
CREATE FUNCTION Security.fn_securitypredicate(@SalesRep AS sysname)
RETURNS TABLE
WITH SCHEMABINDING
AS
RETURN SELECT 1 AS fn_securitypredicate_result
WHERE @SalesRep = USER_NAME() OR USER_NAME() = 'Manager';
GO
CREATE SECURITY POLICY SalesFilter
ADD FILTER PREDICATE Security.fn_securitypredicate(SalesRep)
ON dbo.Sales
WITH (STATE = ON);
如果我有一个更规范化的模式,我的用户名将在一个单独的表中,使用 ID 作为外键。在这种情况下,我将如何使用行级安全性来检查用户名?我可以向过滤谓词添加连接吗?
该函数可以访问表,请记住,这会给每个查询增加额外的开销。