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,就不用再授予给用户具体对象的权限
也即如下
sp_executesql 或者 EXECUTE 执行动态sql的权限问题的更多相关文章
- SQL Server-聚焦sp_executesql执行动态SQL查询性能真的比exec好?
前言 之前我们已经讨论过动态SQL查询呢?这里为何再来探讨一番呢?因为其中还是存在一定问题,如标题所言,很多面试题也好或者有些博客也好都在说在执行动态SQL查询时sp_executesql的性能比ex ...
- 用sp_executesql执行动态SQL语句及获得返回值
过去我执行拼凑出来的动态SQL语句,都直接使用EXEC @sql 的方式.有好几次,都看到有资料说,应该尽量使用 sp_executesql. 究其原因,是因为仅仅参数不同的情况下,sp_execut ...
- Java下拼接执行动态SQL语句(转)
在实际业务中经常需要拼接动态SQL来完成复杂数据计算,网上各类技术论坛都有讨论,比如下面这些问题: http://bbs.csdn.net/topics/390876591 http://bbs.cs ...
- 在Oracle中执行动态SQL的几种方法
转载:在Oracle中执行动态SQL的几种方法 以下为内容留存: 在Oracle中执行动态SQL的几种方法 在一般的sql操作中,sql语句基本上都是固定的,如:SELECT t.empno,t.en ...
- 使用Oracle的DBMS_SQL包执行动态SQL语句
引用自:http://blog.csdn.net/ggjjzhzz/archive/2005/10/17/507880.aspx 在某些场合下,存储过程或触发器里的SQL语句需要动态生成.Oracle ...
- 存储过程中执行动态Sql语句
MSSQL为我们提供了两种动态执行SQL语句的命令,分别是EXEC和sp_executesql;通常,sp_executesql则更具有优势,它提供了输入输出接口,而EXEC没有.还有一个最大的好处就 ...
- sqlserver 动态表名 动态字段名 执行 动态sql
动态语句基本语法: 1 :普通SQL语句可以用exec执行 Select * from tableName exec('select * from tableName') exec sp_execut ...
- SQL SERVER 执行动态SQL EXEC
:普通SQL语句可以用Exec执行 eg: Select * from tableName Exec('select * from tableName') Exec sp_executesql N's ...
- 怎样SQL存储过程中执行动态SQL语句
MSSQL为我们提供了两种动态执行SQL语句的命令,分别是EXEC和sp_executesql;通常,sp_executesql则更具有优势,它提供了输入输出接口,而EXEC没有.还有一个最大的好处就 ...
随机推荐
- Anaconda(python3.6)中使用python2.7
因为我现在安装的是最新版Anaconda3,其自带的Python版本为3.6,如果我们需要添加2.7版本的Python,可以进行如下操作.(同理,如果有人安装的是Anaconda2需要添加Python ...
- GIT命令行笔记
一次常规的初始化+推送: git initgit config user.email "you@example.com"git config user.name "asm ...
- Vsftp的PASV mode(被动模式传送)和Port模式及 Linux下VsFTP配置全方案
什么叫做PASV mode(被动模式传送)?他是如何工作的? FTP的连接一般是有两个连接的,一个是客户程和服务器传输命令的,另一个是数据传送的连接.FTP服务程序一般会支持两种不同的模式,一种是Po ...
- Windows Server 2012 NAT端口转发
- 内存大小设置 Java heap space错误
1. 问题描述 当从数据库中查询大量的数据,每个模板取出来几百万条数据,或者是频繁的刷新项目.模板时就会占用Java虚拟机JVM的大量内存,超过内存就会出现报java.lang.OutOfMemory ...
- 模拟python中的Yield伪并发
并发,在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行. #Yield伪并发 _author_= ...
- 定时任务Job
package com.cfets.ts.u.limitapi.job; import java.text.SimpleDateFormat; import java.util.Date; impor ...
- 零基础学习python_文件(28-30课)
本人小白一枚,随着现在对测试要求越来越高,动不动就要去会一门编程语言,没办法只能学习学习Python,今天看到几个月前还是菜鸟的人突然就已经能使用Python写简单系统了,没办法,虽然之前也简单学习过 ...
- qt tcp 通信实例
#include "mainwindow.h" #include "ui_mainwindow.h" #include <QHostAddress> ...
- django之前-----web应用与框架
一web应用 web应用程序是一种可以通过Web访问的应用程序,程序的最大好处是用户很容易访问应用程序,用户只需要有浏览器即可,不需要再安装其他软件.应用程序有两种模式C/S.B/S. 下面来看一个简 ...