Para ampliar la respuesta, la idea general es crear un papel base de datos y asignar permisos a ese papel. Con el fin de hacer eso, necesita un poco de SQL dinámico de fantasía tales como:
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
Este código otorgará EXECUTE para procedimientos almacenados y funciones escalares y SELECT a las funciones definidas por el usuario que devuelven un tipo de tabla.
Pero lo que @Peter dijo es esencialmente correcto ... deberás otorgar un nombre de usuario para ejecutar privilegios ... este sitio te dará una forma rápida de hacerlo. – Aaron
¡Esa es una solución encantadora! Obtuviste mi voto ... –