SQL Server:函数在一个视图中工作,在另一个视图中返回权限错误。

问题描述 投票:0回答:1

我们有一个简单的函数,用于计算两个日期之间的工作日(不包括周末、节假日)。

在一个视图中,它工作正常,但在另一个视图中,它返回。

在对象 "fx_CountDaysBetween_V2",数据库 "xxxx",模式 "dbo "上,EXECUTE权限被拒绝。

好的视图用这一行调用函数

CASE 
   WHEN r.Current_Status_Code IN (2, 3, 4, 7) 
      THEN dbo.fx_CountDaysBetween_V2(CONVERT(DATE, PA.Create_Date), CONVERT(DATE, GETUTCDATE())) ELSE NULL END AS DaysInQueue,

坏的看法是这样的。

dbo.fx_CountDaysBetween_V2(CONVERT(DATE, rh.Submitted_Date), ISNULL(CONVERT(DATE, rc.Completed_Date), GETUTCDATE())) AS SLA,

有问题的人没有执行权。这看起来是个问题,但为什么一个能用,另一个却不能用。这个函数在其他区域视图中也可以使用,但没有问题。

sql-server permissions execute
1个回答
0
投票

好的视图和坏的视图的所有者是同一个人吗?如果不是,我怀疑是所有权链引起的--请查看 https:/docs.microsoft.comen-ussqlrelational-databasestutorial-ownership-chains-and-context-switching?view=sql-server-ver15。

https:/www.mssqltips.comsqlservertip1778ownership-chaining-in-sql-server-security-feature-or-security-risk

的完整解释,但基本上,如果你给一个用户在一个对象上的权限,比如视图或存储过程,所有者就会把这个权限传递给同一所有者的其他东西。

如果不是这样,检查依赖链(实际上是调用栈),看看在用户第一次开始查询和调用dbo.fx_CountDaysBetween之间是否有用户上下文切换。在其中一个viewsfunctionswhatever中寻找 "EXECUTE AS"。注意,它可以是一个独立的语句,也可以是定义的一部分,所以很难发现。

这是我能想到的2个最常见的原因,如果都不是这两个原因,请对此进行评论,并更新你的帖子,加入所有权信息,也许还可以在调用前插入一个日志语句来记录当前的用户上下文。

© www.soinside.com 2019 - 2024. All rights reserved.