Pour développer la réponse, l'idée générale est de créer un rôle de base de données et attribuer des autorisations à ce rôle. Pour ce faire, vous avez besoin de SQL dynamique de fantaisie tels que:
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
Ce code accordera EXECUTE aux procédures et fonctions scalaires stockées et SELECT à des fonctions définies par l'utilisateur qui renvoient un type TABLE.
Mais ce que @Peter a dit est essentiellement correct ... vous devrez accorder un nom d'utilisateur en exécutant des privilèges ... ce site vous donnera un moyen rapide de le faire. – Aaron
C'est une belle solution! Vous avez mon vote ... –