我是一名学生,我们有一部分任务要在Server中开发一个SQL脚本,以启用行级安全性,它允许某个用户配置文件/组(Sales1)只查看表(Sales.CreditCards)中的行,该表存在于Sales模式中,其中信用卡类型列(CardType)值为'Vista‘。
数据库: Microsoft AdventureWorks2017
它是一个可公开使用的教育数据源(5.5GB)
任务6:添加一个安全策略,允许sales1用户只查看Vista信用卡行。
我可以在网上找到的实现行级安全性的每个示例都是基于表数据本身中包含用户名或特权名称的表构建的。例如,只向Tom显示属于Tom的列,其中Tom的名称位于dataset的一列中。在数据集中没有用户名的情况下,我找不到对数据应用筛选器的任何示例。
下面是我为这个任务设置的脚本,但是我收到了多个错误。请提供一些指导,或指出我的正确方向。
更新:,我想出了如何让它工作!问题解决了!
一旦我通过了最初的错误代码,并使脚本正常工作,问题是我试图将'Vista‘值传递到要在WHERE子句中进行比较的脚本,从末尾的部分进行比较。然而,这是一种落后的逻辑。
相反,传递给“”部分中函数的变量应该是要筛选的列标题,而不是预期值。然后,可以在where子句中定义该值,如下所示。
误差
脚本
USE AdventureWorks2017
GO
GRANT SELECT ON Sales.CreditCard TO Sales1;
GO
/* Setup Row-level security schema */
CREATE SCHEMA Vista;
GO
/*ATTEMPT 5: Create Row-Level security Function */
CREATE FUNCTION Vista.fn_SecurityPredicateEmployee
(@UserID AS sysname,
@CardType AS varchar(20))
RETURNS TABLE
WITH SCHEMABINDING
AS
RETURN SELECT 1 AS Result
FROM Sales.CreditCard AS c
WHERE (@UserID = 'Sales1'
AND 'Vista' = @CardType);
GO
/* ATTEMPT 5: Apply Security Policy */
CREATE SECURITY POLICY Vista.Sales1Filter
ADD FILTER PREDICATE Vista.fn_SecurityPredicateEmployee(USER_NAME(), CardType)
ON [Sales].[CreditCard]
WITH (STATE = ON);
GO
GRANT SELECT ON Vista.fn_SecurityPredicateEmployee TO Sales1;验证
USE AdventureWorks2017
GO
EXECUTE AS USER = 'Sales1';
SELECT * FROM [Sales].[CreditCard]
REVERT;
GO发布于 2022-09-30 03:19:43
更新:我想出了如何让它开始工作!问题解决了!!一旦我通过了最初的错误代码,并使脚本正常工作,问题是我试图将'Vista‘值传递到要在WHERE子句中进行比较的脚本,从末尾的部分进行比较。然而,这是一种落后的逻辑。相反,传递给“”部分中函数的变量应该是要筛选的列标题,而不是预期值。然后,可以在where子句中定义该值,如下所示。
https://stackoverflow.com/questions/73902986
复制相似问题