¿Cuál es la mejor manera de implementar un script SQL que otorgue permisos a una función de base de datos en todas las tablas de usuarios de una base de datos?

StackOverflow https://stackoverflow.com/questions/44780

Pregunta

¿Cuál es la mejor manera de implementar un script SQL que otorgue permisos de selección, referencias, inserción, actualización y eliminación a una función de base de datos en todas las tablas de usuarios de una base de datos?

Idealmente, este script podría ejecutarse varias veces a medida que se agregan nuevas tablas a la base de datos.SQL Server Management Studio genera scripts para objetos de bases de datos individuales, pero estoy buscando más un script de "disparar y olvidar".

¿Fue útil?

Solución

El Dr. Zimmerman está en el camino correcto.Estaría buscando escribir un procedimiento almacenado que tenga un cursor recorriendo los objetos del usuario usando la ejecución inmediata para afectar la concesión.Algo como esto:

 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!] hitting up object %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

Entonces puedes disparar y olvidar:

EXEC sp_grantastic

Otros consejos

Estoy seguro de que hay una manera más sencilla, pero puede recorrer la tabla sysobjects en la base de datos y otorgar permisos a cualquier objeto de la tabla de usuario que exista.Luego, podría ejecutarlo varias veces cada vez que se agreguen nuevas tablas.

Hay un procedimiento de MS no documentado llamado sp_MSforeachtable que puede usar y que definitivamente data de 2000 y 2005.

Para otorgar permisos seleccionados el uso sería:

EXECUTE sp_MSforeachtable @command1=' Grant Select on ? to RoleName'

Para otorgar los otros permisos, tenga una nueva declaración para cada uno o simplemente agréguelos al comando de esta manera:

EXECUTE sp_MSforeachtable @command1=' Grant Select on ? to RoleName; Grant Delete on ? to RoleName;'

Con un poco de experiencia, también sería posible convertir el nombre del rol en un parámetro.

Usamos algo similar donde trabajo.Recorriendo todas las tablas, vistas y procedimientos almacenados del sistema.

CREATE PROCEDURE dbo.SP_GrantFullAccess 
    @username varchar(300)
AS

DECLARE @on varchar(300) 
DECLARE @count int
SET @count = 0

PRINT 'Granting access to user ' + @username + ' on the following objects:'

DECLARE c CURSOR FOR 
SELECT name FROM sysobjects WHERE type IN('U', 'V', 'SP', 'P') ORDER BY name
OPEN c 
FETCH NEXT FROM c INTO @on 
WHILE @@FETCH_STATUS = 0 
BEGIN 
 SET @count = @count + 1
 EXEC('GRANT ALL ON [' + @on + '] TO [' + @username + ']') 
 --PRINT 'GRANT ALL ON [' + @on + '] TO ' + @username
 PRINT @on
 FETCH NEXT FROM c INTO @on 
END 
CLOSE c 
DEALLOCATE c

PRINT 'Granted access to ' + cast(@count as varchar(4)) + ' object(s).'
GO
use [YourDb]
GO
exec sp_MSforeachtable @command1=
    "GRANT DELETE, INSERT, REFERENCES, SELECT, UPDATE ON ? TO Admins, Mgmt",
    @whereand = " and o.name like 'tbl_%'"
GO

use [YourDb]
GO
exec sp_MSforeachtable @command1=
    "GRANT REFERENCES, SELECT ON ? TO Employee, public",
    @whereand = " and o.name like 'tbl_%'"
GO
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top