通常,当我创建存储过程时,我将以下内容用作sort
的模板。
Create procedure <procedurename>
<@param1 <type>, @param2 <type>, etc..> 
as begin

 <procedure>

end

我在这里吗?
例如...我已经看过其他一些类似的问题,但它们似乎都涉及所有存储过程,而不仅仅是一个,我也没有看到一个可以在create procedure脚本中指定权限的地方。即使是有关如何在不使用GUI的情况下为特定存储过程设置权限的答案,也将受到欢迎。在寻找时,我并没有考虑将命令最终与存储过程一起进行批处理。无论如何,我认为它非常漂亮。

Grant execute [User_Execute] 

评论

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

#1 楼

GRANT EXECUTE ON dbo.procname TO username;


#2 楼

截断表对存储过程之类的对象设置权限可以通过以下方法实现:您将只需要确定和授予需要访问(例如执行)对象的必要权限。考虑使用EXECUTE AS功能,该功能使模拟其他用户可以验证执行代码所需的权限,而不必授予所有基础对象(例如表)所有必要的权限。可以将EXECUTE AS添加到存储过程,函数,触发器等中。

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

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


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

当时,您是MOST只需授予对存储的proc EXECUTE权限,然后就将权限授予该存储的proc中引用的所有对象。或致电其他proc)。所有权链接将为您解决这个问题。这对于动态sql或需要创建增强的安全性任务(例如CREATE TABLE)特别有用。 EXECUTE AS是考虑这些问题的便捷工具。

该示例可能有助于阐明所有这些问题: :

CREATE PROCEDURE dbo.MyProcedure WITH EXECUTE AS OWNER


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

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


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

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

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

评论


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

–亚伦·伯特兰(Aaron Bertrand)
2012年6月24日17:07

#3 楼



选择数据库登录->转到Securable并单击上图中的“搜索”按钮。单击“搜索”按钮后,您会在下面的窗口中添加对象的类型。

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

评论


首先,当您回答问题时,问题已经超过五年了。没关系,除非OP特别要求不使用GUI且可以嵌入脚本的解决方案。您的回应并未解决。

–埃里克·布兰特(Eric Brandt)
18年6月27日在16:21