微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用行级安全清除已删除的记录

如何解决如何使用行级安全清除已删除的记录

我们正在寻求有关我希望可以通过行级安全性解决的问题的帮助。我们有 160 个由数据湖提供的表,这些表又由另一个应用程序使用。所有表中都有一个名为 IsDeleted 的字段,如果记录良好则为 0,如果已删除则为 1。我们需要的是除了系统应用程序 ETLapp 之外的任何用户,他们应该只看到 IsDeleted=0 的记录。

使用 Microsoft 示例, 创建用户

CREATE USER mylogin WITHOUT LOGIN;
CREATE USER yourlogin WITHOUT LOGIN;
CREATE USER ETLapp WITHOUT LOGIN;
GO

然后创建表

CREATE SCHEMA SALES
GO
CREATE TABLE SALES.Orders
(OrderID int,SalesRep nvarchar(50),Product nvarchar(50),Quantity smallint,IsDeleted bit
);

填充表格

INSERT INTO SALES.Orders VALUES (1,'Fred','Valve',5,0);
INSERT INTO SALES.Orders VALUES (2,'daphne','Wheel',2,0);
INSERT INTO SALES.Orders VALUES (3,'Scooby','Pizza',1,1);
SELECT * from SALES.Orders;

授予访问权限

GRANT SELECT ON Sales.Orders TO mylogin;
GRANT SELECT ON Sales.Orders to yourlogin;
GRANT SELECT ON Sales.Orders to ETLapp;

这是我无法正确完成的部分。

CREATE FUNCTION rls.SalesPredicate(@UserName as sysname)
RETURNS TABLE
WITH SCHEMABINDING
AS RETURN SELECT 1 AS SalesPredicate_result
WHERE IsDeleted =0 OR UserName = 'ETLapp';
GO

它执行正常,但是当我创建安全策略时,它不会接受用户名,因为用户名不在表中,如果我传递它 IsDeleted,那么我们将获得所有行。

CREATE Security POLICY SalesFilter 
ADD FILTER PREDICATE rls.SalesPredicate(UserName)
ON Sales.Orders
WITH (STATE=ON);
GO

用户 ETLapp 应该看到所有 3 条记录,但其他任何人都应该看到 IsDeleted=0 的两条记录。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。