2011-12-01 136 views
1

我有一个SQL用户,我给出了明确的Execute权限的特定存储过程。此存储过程包含一个truncate语句。用户是无法执行的程序和接收错误:存储过程权限和执行

Cannot find the object TableName because it does not exist or you do not have permissions.

如果我改变了存储过程使用Delete而不是截断用户可以执行的程序。

我需要做什么才能让用户执行这个存储过程,而不会给用户更多的访问权限?

+0

ALTER权限是必需的,请参阅http://msdn.microsoft.com/en-us/library/ms177570.aspx +看看'execute as'示例 –

+0

确切的链接和提示我需要,谢谢。 – Jay

回答

2

从MSDN:

http://msdn.microsoft.com/en-us/library/ms177570.aspx

“所需的最低权限是ALTER上table_name的截断表的权限默认表的所有者,sysadmin固定服务器角色成员和db_owner和db_ddladmin固定数据库但是,您可以将TRUNCATE TABLE语句合并到模块(例如存储过程)中,并使用EXECUTE AS子句向模块授予适当的权限。有关更多信息,请参阅使用EXECUTE AS创建自定义权限集“。

2

你可以试试这个:

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

但是:

create procedure SpName 
with execute as owner 
as 
truncate table TableName 
go 

然后像存储过程的对象分配权限给用户

grant execute on TruncTable to User 
+0

我知道了其他答案,但我很欣赏示例+1 – Jay

0

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

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

CREATE PROCEDURE dbo.MyProcedure WITH EXECUTE AS OWNER 

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

大部分时间,您只需授予EXECUTE存储过程的权限,然后将权限授予存储过程中引用的所有对象。

这样,您不需要给予隐式权限(例如:更新数据或调用其他过程)。所有权链接为您处理。这对动态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绝对没有授予修改该表的权限,或者读取或修改该表中的任何数据。

它只需要完成此过程中编码的特定任务所需的权限。

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