SQLServer,暂时禁用行级安全性

时间:2018-03-06 13:40:06

标签: sql-server row-level-security

我在Person表中的SQLServer中实现了行级安全性(以满足GDPR要求),以便基本用户只能看到个人记录的子集。该 人员表中包含一些必须在系统中唯一的数据(RFID标签)。所以我的应用程序检查没有重复的RFIDtag。

如何在启用RLS时进行此检查,因为查询只能查看行的子集,但RFID必须是全局唯一的?暂时禁用RLS运行此查询的最佳方法是什么?

我的第一个想法是使用存储的函数来执行检查。该功能执行为' sa'用户sa可以看到所有行。还有其他(更简单的)想法吗?

1 个答案:

答案 0 :(得分:0)

UNIQUE索引是最安全的方法,就像在@Jeroen的评论中所说的那样。

但是,在其他上下文中可能需要禁用行级安全性。如果需要,我的建议是:

  • 为此创建一个'admin'用户(CREATE USER admin WITHOUT LOGIN;

在验证功能中包含逻辑以说明此用户:

CREATE FUNCTION Security.fn_securitypredicate(@param as VARCHAR(100))  
RETURNS TABLE  
WITH SCHEMABINDING  
AS  
    RETURN SELECT 1 AS Result
    WHERE
        /* Your logic here */ 
        OR
        USER_NAME() = 'admin' ;

这样,当您模仿'admin'用户时,所有记录都可以访问。任何其他用户,您的行级安全逻辑仍然适用。

在运行查询时模拟用户:

EXECUTE AS USER = 'admin';
SELECT * FROM MyTable;
REVERT; -- Returns to the original user context