0

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

当 RLS 开启时如何做这个检查,因为查询只看到行的一个子集,但是 RFID 必须是全局唯一的?在暂时禁用 RLS 的情况下运行此查询的最佳方法是什么?

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

4

1 回答 1

0

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

不过,在其他情况下可能需要禁用行级安全性。需要时,我的建议是:

  • 为此创建一个“管理员”用户 ( 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' ;

这样,当您冒充“管理员”用户时,所有记录都可以访问。任何其他用户,您的行级安全逻辑仍然适用。

在运行查询时模拟用户:

EXECUTE AS USER = 'admin';
SELECT * FROM MyTable;
REVERT; -- Returns to the original user context
于 2018-03-06T17:42:52.917 回答