我在Person表中的SQLServer中实现了行级安全性(以满足GDPR要求),以便基本用户只能看到个人记录的子集。 Person表具有一些在系统中必须唯一的数据(RFID标签)。所以我的应用程序检查没有重复的RFIDtag。
如何在RLS启用时进行此检查,因为查询只能查看行的子集,但RFID必须是全局唯一的?暂时禁用RLS运行此查询的最佳方法是什么?
我的第一个想法是使用存储的函数来执行检查。作为'sa'用户sa执行的函数可以看到所有行。还有其他(更简单的)想法吗?
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' ;
这样,当您模仿“admin”用户时,所有记录都可以访问。任何其他用户,您的行级安全逻辑仍然适用。
在运行查询时模拟用户:
EXECUTE AS USER = 'admin';
SELECT * FROM MyTable;
REVERT; -- Returns to the original user context