使用只有读取权限的帐户执行存储过程

ISW*_*ISW 4 sql-server stored-procedures sql-server-2012

我创建了一个有一个存储过程TRUNCATE,并INSERT在它的语句,我使用的一个SSRS报告。

我通常只使用作为db_datareaderSSRS 报告成员的帐户,但是此存储过程不会使用只有这些权限的帐户执行。尝试执行存储过程时报如下错误:

找不到对象“table_name”,因为它不存在或您没有权限。

我是否需要使用有db_datawriter成员的帐户来执行此 SP,或者有什么方法可以让我的db_datareader帐户执行它?

Mar*_*lli 5

当我遇到某人(AD 组或用户)需要TRUNCATE一个表或一组表的情况时,我使用该WITH EXECUTE AS 'dbo'子句在存储过程中编写代码,并将此过程的执行权限授予 AD 组/用户指定去做这项工作。

例如:

CREATE PROCEDURE dbo.TruncateMyTable
WITH EXECUTE AS 'dbo'
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;
    -- Delete all existing rows from tables as we only need a daily snapshot
    TRUNCATE TABLE dbo.MyTable;
END
GO

GRANT EXECUTE ON [dbo].TruncateMyTable TO [User];
Run Code Online (Sandbox Code Playgroud)

使用该WITH EXECUTE AS dbo子句创建的存储过程允许存储过程在拥有存储过程所在数据库的服务器主体的安全上下文下运行。这在本质上可以存储过程做这样的事情TRUNCATE TABLE,通常没有是不可能的db_ddladminsysadmin权利。在上面的示例中,[User]将允许数据库主体执行该dbo.TruncateMyTable过程,从而截断dbo.MyTable表。