首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >数据中没有用户名的Server行级安全性

数据中没有用户名的Server行级安全性
EN

Stack Overflow用户
提问于 2022-09-30 01:01:09
回答 1查看 95关注 0票数 0

我是一名学生,我们有一部分任务要在Server中开发一个SQL脚本,以启用行级安全性,它允许某个用户配置文件/组(Sales1)只查看表(Sales.CreditCards)中的行,该表存在于Sales模式中,其中信用卡类型列(CardType)值为'Vista‘。

数据库: Microsoft AdventureWorks2017

它是一个可公开使用的教育数据源(5.5GB)

任务6:添加一个安全策略,允许sales1用户只查看Vista信用卡行。

我可以在网上找到的实现行级安全性的每个示例都是基于表数据本身中包含用户名或特权名称的表构建的。例如,只向Tom显示属于Tom的列,其中Tom的名称位于dataset的一列中。在数据集中没有用户名的情况下,我找不到对数据应用筛选器的任何示例。

下面是我为这个任务设置的脚本,但是我收到了多个错误。请提供一些指导,或指出我的正确方向。

更新:,我想出了如何让它工作!问题解决了!

一旦我通过了最初的错误代码,并使脚本正常工作,问题是我试图将'Vista‘值传递到要在WHERE子句中进行比较的脚本,从末尾的部分进行比较。然而,这是一种落后的逻辑。

相反,传递给“”部分中函数的变量应该是要筛选的列标题,而不是预期值。然后,可以在where子句中定义该值,如下所示。

误差

代码语言:javascript
运行
复制

脚本

代码语言:javascript
运行
复制
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;

验证

代码语言:javascript
运行
复制
USE AdventureWorks2017
GO

EXECUTE AS USER = 'Sales1';
SELECT * FROM [Sales].[CreditCard]

REVERT;
GO
EN

回答 1

Stack Overflow用户

发布于 2022-09-30 03:19:43

更新:我想出了如何让它开始工作!问题解决了!!一旦我通过了最初的错误代码,并使脚本正常工作,问题是我试图将'Vista‘值传递到要在WHERE子句中进行比较的脚本,从末尾的部分进行比较。然而,这是一种落后的逻辑。相反,传递给“”部分中函数的变量应该是要筛选的列标题,而不是预期值。然后,可以在where子句中定义该值,如下所示。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73902986

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档