问题描述
我们正在寻求有关我希望可以通过行级安全性解决的问题的帮助。我们有 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 (将#修改为@)