SQL Server 2005中的内置数据库角色允许执行存储过程?

时间:2010-02-19 17:17:23

标签: sql sql-server sql-server-2005 permissions roles

在SQL Server 2005中,有内置角色:

  

的db_datareader

     

db_datawriter权限

     

是否有任何角色可以让用户执行存储过程?

我不想使用db_owner,因为这将允许删除和更新,这是我不需要的。我需要的唯一权限是:

  

选择

     

EXECUTE

4 个答案:

答案 0 :(得分:21)

看看这个article。它可能会为您提供一个有趣的想法,以便快速完成此任务。

该文章中使用的代码:

/* Create a new role for executing stored procedures */
CREATE ROLE db_executor

/* Grant stored procedure execute rights to the role */
GRANT EXECUTE TO db_executor

/* Add a user to the db_executor role */
EXEC sp_addrolemember 'db_executor', 'AccountName'

答案 1 :(得分:2)

不,我不相信存在数据库或服务器角色 - 您必须将执行权限细化地授予用户相关存储过程。

答案 2 :(得分:2)

CREATE ROLE db_executor

GRANT EXECUTE TO db_executor

现在,如果您重新启动SQL Server Management Studio,那么当您单击"用户映射"在Security->登录部分的页面中,您将看到" db_executor"出现在角色列表中。只需添加用户或您可以手动执行:

EXEC sp_addrolemember 'db_executor', 'AccountName'

答案 3 :(得分:0)

要扩展答案,一般要点是创建数据库角色并为该角色分配权限。为此,您需要一些花哨的动态SQL,例如:

Set @Routines = Cursor Fast_Forward For
    Select ROUTINE_SCHEMA + '.' + ROUTINE_NAME, ROUTINE_TYPE, DATA_TYPE
    From INFORMATION_SCHEMA.ROUTINES
    Where ROUTINE_NAME NOT LIKE 'dt_%'
        Or ROUTINE_TYPE = 'FUNCTION'

Open @Routines
Fetch Next From @Routines Into @Procname, @RoutineType, @DataType

While @@Fetch_Status = 0
Begin
    Set @Msg = 'Procname: ' + @Procname + ', Type: ' + @RoutineType + ', DataType: ' + Coalesce(@DataType,'')
    Raiserror(@Msg, 10, 1) WITH NOWAIT

    If @RoutineType = 'FUNCTION' And @DataType = 'TABLE'
        Set @SQL = 'GRANT SELECT ON OBJECT::' + @Procname + ' TO StoredProcedureDataReader'
    Else
        Set @SQL = 'GRANT EXECUTE ON OBJECT::' + @Procname + ' TO StoredProcedureDataReader'

    exec(@SQL)

    Fetch Next From @Routines Into @Procname, @RoutineType, @DataType
End

Close @Routines
Deallocate @Routines

此代码将EXECUTE授予存储过程和标量函数,并将SELECT授予返回TABLE类型的用户定义函数。