O SQL Server 2016 oferece suporte à segurança em nível de linha, o que é ótimo. No entanto, todos os exemplos assumem que o nome de usuário está dentro da tabela à qual você deseja aplicar segurança (consulte o exemplo abaixo - do 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);
Se eu tivesse um esquema mais normalizado, meu nome de usuário estaria em uma tabela separada, usando um ID como chave estrangeira. Nessa situação, como eu usaria a segurança em nível de linha para verificar um nome de usuário? Posso adicionar uma junção ao predicado do filtro?
A função pode ter acesso à tabela, lembre-se de que isso adicionará sobrecarga adicional a cada consulta.