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


40

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

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

 <procedure>

end

有没有一种方法可以在我使用该存储过程时仅授予该存储过程执行权限?
例如...

Grant execute [User_Execute] 

...但是仅用于此存储过程?

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

编辑 最佳答案肯定会指出正确的方向,这本质上就是我要寻找的东西,我没想到要对命令进行批处理,而这正是我最终要做的,将命令与存储过程一起进行。无论如何,我认为它非常漂亮。

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

<procedure>

end
GO
GRANT EXECUTE ON <procedurename> to <username>
GO

在编辑的文本中提供的代码是有效的,并且是对该问题的正确答案。
ninty9notout

Answers:



10

截断表对对象(如存储过程)的设置权限可以通过以下方法完成:

GRANT EXECUTE ON <schema>.<object> to <user>;

但是,您可能还想在登录和用户级别上授予安全权限。您将只需要确定和授予需要访问(例如执行)对象的必要权限。考虑使用该EXECUTE AS功能,该功能使模拟其他用户可以验证执行代码所需的权限,而不必向所有基础对象(例如表)授予所有必要的权限。EXECUTE AS可以添加到存储过程,函数,触发器等中

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

CREATE PROCEDURE dbo.MyProcedure WITH EXECUTE AS OWNER

在这种情况下,您要冒充被调用模块的所有者。您也可以模拟SELF,或者用户创建或更改模块OR ... imperonate CALLER,这将使模块能够获得当前用户的权限,或者OR ...模拟OWNER,它将获得当前用户的许可。过程的所有者被称为OR ...冒充'user_name',将模拟特定的用户OR ...冒充'login_name'与将模拟特定的登录名。

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

这样,您无需授予隐式权限(例如:更新数据或调用其他proc)。所有权链接可以为您解决这个问题。这对于动态sql或需要创建增强的安全性任务(例如)特别有用CREATE TABLEEXECUTE AS是考虑这些的便捷工具。

这个例子可以帮助澄清所有这些:

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

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

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

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.

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

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

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


4
与您昨天在SO上发布的答案相同,为了便于阅读,我还必须对其进行格式化。
亚伦·伯特兰

5

在此处输入图片说明

选择数据库登录->转到Securable,然后单击搜索按钮,如上图所示。单击“搜索”按钮后,您将在随后的窗口中添加对象类型。

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


首先,当您回答问题时,这个问题已经超过五年了。没关系,除非OP特别要求不使用GUI且可以嵌入脚本的解决方案。您的回应并未解决。
埃里克·布兰特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.