当前位置: 首页 > 面试题库 >

使用动态SQL的存储过程中的SQL Server权限

广晔
2023-03-14
问题内容

我有一个具有应用程序角色的数据库。角色成员都属于Active
Directory中的组。我没有给角色授予从表中进行选择的权限,而是给角色赋予了对它需要调用的所有存储过程的执行权限。

除了我的存储过程之一,该过程可以建立一些动态SQL并调用sp_executesql之外,其他方法都可以正常工作。

动态sql看起来像这样:

SET @SQL = N'
SELECT * 
FROM dbo.uvView1 
INNER JOIN uvView2 ON uvView1.Id = uvView2.Id'

EXEC sp_executesql @SQL

具有此角色的用户无法调用存储过程。它给出了以下错误,这是我所预期的:

对对象“ uvView1”,数据库“ Foobar”,模式“ dbo”的SELECT权限被拒绝。

有没有一种方法可以让我的用户成功执行此proc而不给动态SQL中的所有视图授予角色权限?


问题答案:

是的。

向该过程中添加EXECUTE AS CALLER子句,然后对存储过程进行 签名 ,并向 签名
授予所需的权限。这是100%安全,可靠和防弹的。请参阅带有证书的签名过程。



 类似资料:
  • 问题内容: 如何在MySQL存储过程中构建和使用动态SQL? 问题答案: 我不相信MySQL支持动态sql。您可以执行类似但不同的“准备”语句。 这是一个例子: 准备好的语句通常用于查看给定查询的执行计划。由于它们是使用 execute 命令执行的,并且可以将 sql 分配给变量,因此您可以近似地估计一些与动态sql相同的行为。 这是一个很好的链接: 不要忘记使用最后一行取消分配! 祝好运!

  • 问题内容: 我有一张桌子,我需要在99%的时间内自动分配ID(其他1%似乎使用身份列来排除)。因此,我有一个存储过程来获取以下行中的下一个ID: `` 检查必须检查用户是否手动使用了ID并找到下一个未使用的ID。 当我依次调用它并返回1、2、3时,它可以正常工作。我需要做的是在多个进程同时调用此方法的情况下提供一些锁定。理想情况下,我只需要它专用于围绕此代码锁定last_auto_id表,以便第二

  • 问题内容: 我正在编写一个存储过程,需要在该过程中动态构造一个SQL语句以引用传入的表名。 我需要让该SQL语句返回结果,然后可以在整个过程的其余部分中使用它。 我已经尝试过使用临时表和其他所有东西,但是我不断收到一条消息,我需要声明变量等。 例如: 或者… 无论如何,有没有这样做而不使用实际表? 谢谢。 问题答案: 您是否尝试过类似的方法: 您需要确保将nvarchar字符串加N作为前缀,例如。

  • 问题内容: 我正在尝试将LIKE关键字与%通配符一起包装参数,但是我不确定如何在不破坏它的情况下将%字符放入语句中。现在我有: 我的.net应用程序中出现SqlException错误,提示“运行时’@search’附近语法不正确。如果删除@search参数周围的%字符,该错误就会消失。 问题答案: %字符必须 在 搜索字符串中… 请注意,以下内容也可以使用,但会引入潜在的SQL注入漏洞…

  • 本文向大家介绍sqlserver中存储过程的递归调用示例,包括了sqlserver中存储过程的递归调用示例的使用技巧和注意事项,需要的朋友参考一下 递归式指代码片段调用自身的情况;危险之处在于:如果调用了自身一次,那么如何防止他反复地调用自身。也就是说提供递归检验来保证适当的时候可以跳出。 以阶层为例子说存储过程中递归的调用。 递归 当创建此存储过程时候,会遇见一条报告信息

  • 问题内容: 我有以下SP,当它自己运行时,它可以正常工作: 我遇到的问题是,当我为SSRS报表添加数据集时,它没有在“字段”部分中提取任何字段/列。我猜这是由于动态SQL引起的吗? 我该如何解决? 问题答案: 包含Dynamic Sql和Temp表 的问题 存储proc是诸如SSRS和ORM生成器(如Linq2SQL和EF逆向工程工具)之类的向导的祸根。 这是因为在运行PROC之前(或最近使用)的