如何授予单个存储过程的执行权限?

Dan*_*Edw 46 sql-server

通常,当我创建存储过程时,我使用以下作为排序模板

Create procedure <procedurename>
<@param1 <type>, @param2 <type>, etc..> 
as begin

 <procedure>

end
Run Code Online (Sandbox Code Playgroud)

有没有办法在我使用时仅授予对该存储过程的执行权限?
比如像...

Grant execute [User_Execute] 
Run Code Online (Sandbox Code Playgroud)

...但仅针对此存储过程?

我见过一些其他类似的问题,但它们似乎都涉及所有存储过程,而不仅仅是一个,我也没有看到可以在create procedure脚本中指定权限的问题。甚至有关如何在没有 GUI 的情况下为特定存储过程设置权限的答案也将受到欢迎。

编辑 最重要的答案肯定为我指明了正确的方向,这基本上就是我正在寻找的,我没有考虑将我最终做的命令批处理,将命令与我的存储过程一起批处理。反正我觉得还挺好看的。

Create procedure <procedurename>
<@param1 <type>, @param2 <type>, etc..> 
as begin

<procedure>

end
GO
GRANT EXECUTE ON <procedurename> to <username>
GO
Run Code Online (Sandbox Code Playgroud)

Lev*_*i W 72

GRANT EXECUTE ON dbo.procname TO username;
Run Code Online (Sandbox Code Playgroud)


小智 12

truncate table 可以通过以下方式完成对存储过程等对象的设置权限:

GRANT EXECUTE ON <schema>.<object> to <user>;
Run Code Online (Sandbox Code Playgroud)

但是,您可能还想在登录和用户级别授予安全权限。您将只想为需要访问(例如执行)的对象确定并仅授予必要的权限。考虑使用EXECUTE AS允许模拟另一个用户来验证执行代码所需的权限的功能,而不必将所有必要的权限授予所有底层对象(例如表)。EXECUTE AS可以添加到存储过程、函数、触发器等中。

在存储过程中添加如下代码:

CREATE PROCEDURE dbo.MyProcedure WITH EXECUTE AS OWNER
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您是在模拟被调用模块的所有者。您还可以模拟 SELF,或创建或更改模块的用户 OR... 模拟 CALLER ,这将使模块能够承担当前用户的权限,或...模拟 OWNER,这将承担模块的权限被调用的过程的所有者 OR... impersonate 'user_name',这将模拟特定用户 OR... impersonate 'login_name' with 将模拟特定登录。

大多数时候,您只需要授予EXECUTE存储过程的权限,然后将权限授予存储过程中引用的所有对象。

通过这种方式,您无需授予隐式权限(例如:更新数据或调用其他过程)。所有权链接会为您处理这个问题。这对于动态 sql 或如果您需要创建提升的安全性任务(例如CREATE TABLE. EXECUTE AS是考虑这些的方便工具。

这个例子可能有助于澄清所有这些:

创建一个名为 NoPrivUser 的用户,该用户具有对数据库的公共访问权限(例如 dbdb):

USE [master];
GO 
CREATE LOGIN [NoPrivUser] WITH PASSWORD=N'ABC5%', DEFAULT_DATABASE=[dbadb], 
  CHECK_EXPIRATION=ON, CHECK_POLICY=ON;
GO 
USE [DBAdb];
GO 
CREATE USER [NoPrivUser] FOR LOGIN [NoPrivUser];
GO
Run Code Online (Sandbox Code Playgroud)

注意:此过程的创建者或所有者将需要在目标数据库中创建表权限。

use DBAdb 
go 
CREATE PROCEDURE dbo.MyProcedure 
WITH EXECUTE AS OWNER 

truncate table MyTable

GO
GRANT EXEC ON dbo.MyProcedure TO NoPrivUser; 
GO
-- Now log into your database server as NoPrivUser and run the following.
Run Code Online (Sandbox Code Playgroud)

使用该EXECUTE AS子句,存储过程在对象所有者的上下文中运行。此代码成功创建dbo.MyTable并成功插入行。在此示例中,用户NoPrivUser绝对没有修改表或读取或修改该表中的任何数据的权限。

它仅具有完成此过程上下文中编码的特定任务所需的权限。

这种创建可以执行需要提升的安全权限的任务而不永久分配这些权限的存储过程的方法非常有用。

  • 这是 [您昨天在 SO 上发布的相同答案](http://stackoverflow.com/questions/8341291/stored-procedure-permissions-and-execute),我还必须对其进行格式化以提高可读性。 (4认同)

小智 5

在此处输入图片说明

选择数据库登录-->转到安全并单击搜索按钮,如上图所示。单击“搜索”按钮后,您会发现以下窗口可以添加对象类型。

单击对象类型按钮,您将获得包含各种对象的“选择对象类型”窗口。现在,如果您看到,存储过程已列在对象类型区域中。现在我们将选择我们想要提供权限的特定存储过程。