专注,勤学,慎思。戒骄戒躁,谦虚谨慎

just do it

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

sp_executesql 或者 EXECUTE 执行动态sql的权限问题

当 sp_executesql 或 EXECUTE 语句执行字符串时,字符串将作为它的自包含批处理执行。
SQL Server 会将字符串中的一个或多个 Transact-SQL 语句编译为独立于批处理(包含 sp_executesql 或 EXECUTE 语句)执行计划的执行计划。

跟权限有什么关系?也就是说通过 sp_executesql 或 EXECUTE执行的sql被编译为独立的批处理,并不是当前用户可以直接执行的,还是通过问题来说明吧。

 

创建用户

直接上例子,创建一个用户,通过一个用户执行非动态sql的存储过程和动态sql的存储过程看这其中的权限问题

 

以新创建用户的身份执行非动态sql和动态sql的存储过程

创建一个非动态sql的存储过程,授权给ReadWriteUser执行这个存储过程的权限

以ReadWriteUser这个用户的身份执行存储过程TestPrivilege_NoDynamic,没有问题

 

新创建一个以sp_executesql执行动态sql的存储过程,同样授权给ReadWriteUser这个存储过程的执行权限

以ReadWriteUser这个用户的身份执行存储过程TestPrivilege_WithDynamic,此时是执行失败的,即便是ReadWriteUser具有执TestPrivilege_WithDynamic这个存储过程的权限

  此时如果给ReadWriteUser授权表上的读的权限:grant select on T1 to ReadWriteUser,再次执行TestPrivilege_WithDynamic
  然后再执行存储过程,是没有问题的

  

  用户虽然有执行存储过程的权限,因为给User授予了执行存储过程的权限(grant execute on TestPrivilege_WithDynamic to ReadWriteUser)
  但是如果存储过程中有动态sql,就会出现“The SELECT(或者Insert,Update,Delete)permission was denied on the object '***'”
  此时就需要给User授予具体的表上的对应的SELECT(或者Insert,Update,Delete)权限,然后才能正常地执行包含动态sql的存储过程

  

  另外一种方式是在存储过程中WITH EXECUTE AS OWNER,
  WITH EXECUTE AS OWNER只需授予用户对模块自身的权限,而无需授予用户对被引用对象的显式权限。
  也就是说,在存储过程中加上了WITH EXECUTE AS OWNER,就不用再授予给用户具体对象的权限

  也即如下

  

 

posted on   MSSQL123  阅读(2010)  评论(1编辑  收藏  举报

编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示