Встроенная роль базы данных в SQL Server 2005, чтобы разрешить выполнение хранимых процедур? - PullRequest
15 голосов
/ 19 февраля 2010

В SQL Server 2005 есть встроенные роли:

db_datareader

db_datawriter

и т.д.

Существует ли какая-либо роль, которая позволяет пользователю выполнять сохраненный процесс?

Я не хочу использовать db_owner, потому что это позволит удалять и обновления, которые мне не нужны Единственные разрешения, которые мне нужны:

SELECT

EXECUTE

Ответы [ 4 ]

21 голосов
/ 19 февраля 2010

Взгляните на эту статью .Это может дать вам интересную идею сделать это быстро.

Код, используемый в этой статье:

/* 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'
2 голосов
/ 17 июня 2014
CREATE ROLE db_executor

GRANT EXECUTE TO db_executor

Теперь, если вы перезапустите SQL Server Management Studio, при нажатии на страницу «Сопоставление пользователей» в разделе Security-> Logins вы увидите «db_executor» в списке ролей.Просто добавьте пользователя или вы можете сделать это вручную:

EXEC sp_addrolemember 'db_executor', 'AccountName'
2 голосов
/ 19 февраля 2010

Нет, я не верю, что существует роль базы данных или сервера - вам необходимо детально предоставить разрешение на выполнение для соответствующих хранимых процедур.

0 голосов
/ 20 февраля 2010

Чтобы расширить ответ, основная суть заключается в создании роли базы данных и назначении разрешений для этой роли. Для этого вам понадобится какой-нибудь модный динамический 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.

...