La Guía Definitiva para Otorgar Permisos en Todas las Tablas de Usuario en SQL Server
Gestionar permisos en SQL Server es crucial para mantener la integridad y seguridad de tu base de datos. Un escenario común surge cuando necesitas otorgar permisos en todas las tablas de usuario a un rol específico de la base de datos sin inconvenientes. Si te sientes frustrado por tener que escribir múltiples scripts o ajustar manualmente permisos cada vez que agregas nuevas tablas, no estás solo. En esta guía, exploraremos cómo crear un script SQL versátil que te permita otorgar permisos de SELECT
, REFERENCES
, INSERT
, UPDATE
y DELETE
a un rol de base de datos en todas las tablas de usuario con facilidad.
El Desafío: Otorgar Permisos de Manera Eficiente
SQL Server Management Studio (SSMS) genera típicamente scripts para objetos de base de datos individuales, lo que puede ser tedioso al tratar con múltiples tablas. Además, modificar permisos para tablas recién agregadas puede convertirse rápidamente en una tarea que consume mucho tiempo. Lo que necesitas es un script robusto de “fire-and-forget” que pueda ejecutarse para aplicar permisos en todas las tablas de usuario sin necesidad de volver a visitar el script cada vez.
La Solución: Un Procedimiento Almacenado para Otorgar Permisos
Para automatizar eficazmente la concesión de permisos, podemos crear un procedimiento almacenado que emplee un cursor para recorrer todos los objetos de usuario y otorgar los permisos deseados. Vamos a desglosar el proceso en pasos manejables:
Paso 1: Crear el Procedimiento Almacenado
Comienza definiendo tu procedimiento almacenado. Usa el siguiente código SQL como plantilla:
IF EXISTS (
SELECT 1 FROM sysobjects
WHERE name = 'sp_grantastic'
AND type = 'P'
)
DROP PROCEDURE sp_grantastic
GO
CREATE PROCEDURE sp_grantastic
AS
DECLARE
@object_name VARCHAR(30),
@time VARCHAR(8),
@rights VARCHAR(20),
@role VARCHAR(20)
DECLARE c_objects CURSOR FOR
SELECT name
FROM sysobjects
WHERE type IN ('P', 'U', 'V')
FOR READ ONLY
BEGIN
SELECT @rights = 'ALL',
@role = 'PUBLIC'
OPEN c_objects
WHILE (1=1)
BEGIN
FETCH c_objects INTO @object_name
IF @@SQLSTATUS <> 0 BREAK
SELECT @time = CONVERT(VARCHAR, GetDate(), 108)
PRINT '[%1!] accediendo al objeto %2!', @time, @object_name
EXECUTE('GRANT '+ @rights +' ON '+ @object_name+' TO '+@role)
END
PRINT '[%1!] fin!', @time
CLOSE c_objects
DEALLOCATE CURSOR c_objects
END
GO
GRANT ALL ON sp_grantastic TO PUBLIC
GO
Paso 2: Entender los Componentes
- Declaración de Cursor: El cursor
c_objects
se configura para recorrer todas las tablas de usuario (U
), vistas (V
) y procedimientos almacenados (P
). - Ejecución de Grants: Para cada objeto recuperado a través del cursor, el sistema ejecuta un comando
GRANT
, aplicando los derechos definidos al rol especificado. - Información de Salida: El procedimiento imprime registros que indican la hora de ejecución y cualquier objeto al que se le hayan otorgado permisos.
Paso 3: Ejecutar el Procedimiento
Una vez creado el procedimiento almacenado, puedes ejecutarlo con un simple comando:
EXEC sp_grantastic
Con solo este comando, tu rol de base de datos recibirá los permisos necesarios en todas las tablas de usuario sin problemas.
Conclusión
Acabas de aprender a crear un poderoso script SQL que otorga permisos a un rol de base de datos en todas las tablas de usuario de manera sencilla. Este enfoque no solo optimiza tu flujo de trabajo, sino que también asegura que tus permisos estén siempre actualizados sin intervención manual. La próxima vez que agregues una nueva tabla a tu base de datos, simplemente ejecuta el procedimiento almacenado nuevamente, y estarás listo para continuar.
¡Feliz codificación!