用户可以创建但不能执行存储过程

Posted

技术标签:

【中文标题】用户可以创建但不能执行存储过程【英文标题】:User can create but not execute stored procedure 【发布时间】:2013-07-11 09:19:58 【问题描述】:

问题

我有一个允许创建存储过程但不能执行它们的 SQL Server 登录名。我无法使用另一个登录来授予执行权限,因此我正在寻找一种替代方法来运行 sp 中的代码或授予这些权限。

对象“sp_mystoredprocedurename”、数据库“mydatabasename”、架构“dbo”的 EXECUTE 权限被拒绝。

用户不能授予自己执行权限

不能授予、拒绝或撤销对 sa、dbo、实体所有者、information_schema、sys 或您自己的权限。

背景

我们有一个用 Powerbuilder 编写的 Windows 软件应用程序,它可以创建和更新它自己运行的 SQL Server 数据库。

在第一次启动时,应用程序会提示输入数据库管理员登录名,它会使用 1 次(我们不存储此信息)来创建数据库和登录名。登录被授予db_ddladmindb_datareaderdb_datawriter 权限。我们目前有数百个这样的应用程序和数据库运行在我们管理的服务器上,也运行在我们客户自己的服务器上。

出于这个原因,我会做任何事情来防止再次要求用户登录数据库管理员以便我可以授予执行权限,这将是最简单的方法...将所有服务器降级到 SQL Server 2000 是当然也不是一个选择:)

我试图实现的存储过程是一个“getnewid”方法。目前我的 Powerbuilder 代码使用多个嵌入式 TSQL 语句来实现这一点,但由于网络性能问题,我想将这些移动到单个存储过程中。

【问题讨论】:

没有数据库管理员,所以我无法使用授权。我 99% 确定这是第 22 条问题,因此无法解决。我只是想听听我是否错过了什么或者是否有其他选择。在 SQL Server 2000 中,如果允许您创建存储过程,就可以执行它。 您好,如果您在 sql 逻辑中不进行任何数据修改,则用户定义函数 (UDF) 可能是一种替代方案。如果您有权执行/创建它们。 【参考方案1】:

这有帮助吗?

CREATE ROLE db_executer
GRANT EXECUTE to db_executer
EXEC sp_addrolemember N'db_executer', N'<username>'

【讨论】:

恐怕不行,因为登录的用户不能执行存储过程。所以我无法执行 sp_addrolemember... @MartijnKooij 不,当然不是,您不能破解数据库授予自己更多权限,为了让您的用户能够执行所有程序,包括将来制作的程序,您需要运行这个脚本。你需要一个数据库管理员来为你运行这个【参考方案2】:

试试这个。

GRANT EXECUTE ON sp_OACreate to UserLogin
GO

【讨论】:

以上是关于用户可以创建但不能执行存储过程的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server创建存储过程——动态SQL

SQL Server创建存储过程——动态SQL

SQL Server创建存储过程——动态SQL

SQL Server创建存储过程——动态SQL

通过oracle dblink,怎么执行远程数据库的存储过程。或者说可以执行吗?怎么弄?

无法执行 MySQL 存储过程