Recientemente yo tenía que otorgar permisos a muchos usuarios a muchos store procedures en SQL Server 2000 y hacerlo manualmente era una tarea tediosa, así que por ahí me encontré algo en internet para poder hacer esto.
Cuando ejecuten este script sólo especifiquen el nombre de la base de datos.
Después de ejecutarlo les aparecerán ciertos mensajes de error y que no afectan para
el objetivo. Este error se da porque en la consulta:
SELECT name FROM master..sysxlogins
WHERE srvid IS NULL AND name <> 'sa'
Se extraen a todos los usuarios en la base de datos y muy probablemente los usuarios
a los que desea otorgar permisos de ejecución a los SP no existen en la base de datos especificada, pero si los otorgará a los que si existen, de esta manera el
motor de SQL Server excluirá automáticamente a estos y lo expresará mediante un mensaje de error.
--*********************************SCRIPT****************************************
--Otorga permisos de ejecución a todos los sp a todos los usuarios de una base de datos.
--Especifique la BD que desea usar para otorgar.
Use NombreBD
--Variables de uso
Declare @login varchar(50), @proc varchar(100), @stmt nvarchar(200)
DECLARE loginBD CURSOR FOR
--Extraer a todos los logins, no importa que no estén en la BD de uso.
SELECT name FROM master..sysxlogins
WHERE srvid IS NULL AND name <> 'sa'
-- Avanzamos un registro y cargamos en las variables los valores encontrados en el primer registro
OPEN loginBD
FETCH NEXT FROM loginBD
--Vaciar el valor obtenido por el curos en una variable.
INTO @login
WHILE @@FETCH_STATUS = 0
BEGIN
Declare curse cursor for
--Obtener a todos los SP de la base de datos actual.
SELECT name
FROM sysobjects
WHERE type = 'P' AND category = 0
OPEN CURSE
fetch next from curse into @proc
while @@fetch_status=0
Begin
--Ejecutar los permisos
set @stmt='grant execute on '+@proc+' to ' +@login
exec SP_EXECUTESQL @STMT
If @@Error<> 0
print ''
Else
print '***El usuario: ' +@login + ' puede ejecutar al store procedure: ' + @proc
fetch next from curse into @proc
end
--Desocupar el cursor
close curse
deallocate curse
-----Siguiente Login
FETCH NEXT FROM loginBD
--Vaciar el siguiente valor obtenido por el curos en una variable.
INTO @login
END
--Desocupar el cursor.
CLOSE loginBD
DEALLOCATE loginBD
GO
--*****************************FIN*SCRIPT****************************************
No hay comentarios.:
Publicar un comentario