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,就不用再授予给用户具体对象的权限
也即如下
原文地址:https://www.cnblogs.com/wy123/p/6373304.html
相关推荐
-
如何用几个简单的命令改善你的Linux安全 服务器
2019-2-23
-
实战生产环境:最新K8s Annotations详解 服务器
2019-8-16
-
解决liunx系统,项目nuxt2.0运行npm run dev / start报错问题 服务器
2019-3-31
-
修改libpng库源码解决libpng warning: iCCP: known incorrect 服务器
2019-9-14
-
Linux 防火墙:关于 iptables 和 firewalld 的那些事 服务器
2019-2-20
-
帮助你驾驭 Kubernetes 的 4 个工具 服务器
2019-8-17
-
linux入门系列20–Web服务之LNMP架构实战 服务器
2020-6-11
-
Linux下PHP开发环境搭建(Apache2.4+PHP7.1+MySQL5.7) 服务器
2020-5-31
-
Prometheus 入门 服务器
2019-8-17
-
互联网_Hacker 服务器
2020-7-11