none
Copiar permisos de un usuario a un grupo de dominio RRS feed

  • Pregunta

  • Estimados.

    Tengo un SS2012, el usuario llamado consultas tiene permisos a objetos de distintas bases de datos, acabo de crear un grupo de dominio y quisera otorgarlos todos los permisos que tiene el usuario consultas

    Además de lo anterior el usuario consulta en algunas bases pertenece al rol datareader y/o datawriter, entonces la idea es poder copiar esos privilegios.

    Saludos Cordiales.


    DBA SQL Server Santiago/Chile


    • Editado CMAPM miércoles, 28 de febrero de 2018 15:22
    miércoles, 28 de febrero de 2018 14:59

Respuestas

  • No soy DBA así que no suelo hacer este tipo de cosas.  Buscando un poco encontré una consulta que parece proveer todo lo necesario para crear SQL dinámico.

    SELECT [UserName] = ulogin.[name]
    	,[UserType] = CASE princ.[type]
    		WHEN 'S'
    			THEN 'SQL User'
    		WHEN 'U'
    			THEN 'Windows User'
    		WHEN 'G'
    			THEN 'Windows Group'
    		END
    	,[DatabaseUserName] = princ.[name]
    	,[Role] = NULL
    	,[PermissionState] = PERM.[state_desc]
    	,[PermissionType] = PERM.[permission_name]
    	,[ObjectType] = CASE PERM.[class]
    		WHEN 1
    			THEN obj.type_desc -- Schema-contained objects
    		ELSE PERM.[class_desc] -- Higher-level objects
    		END
    	,[ObjectName] = CASE PERM.[class]
    		WHEN 1
    			THEN OBJECT_NAME(PERM.major_id) -- General objects
    		WHEN 3
    			THEN schem.[name] -- Schemas
    		WHEN 4
    			THEN imp.[name] -- Impersonations
    		END
    	,[ColumnName] = col.[name]
    FROM --database user
    	sys.database_principals princ
    LEFT JOIN --Login accounts
    	sys.server_principals ulogin ON princ.[sid] = ulogin.[sid]
    LEFT JOIN --Permissions
    	sys.database_permissions PERM ON PERM.[grantee_principal_id] = princ.[principal_id]
    LEFT JOIN --Table columns
    	sys.columns col ON col.[object_id] = PERM.major_id
    	AND col.[column_id] = PERM.[minor_id]
    LEFT JOIN sys.objects obj ON PERM.[major_id] = obj.[object_id]
    LEFT JOIN sys.schemas schem ON schem.[schema_id] = PERM.[major_id]
    LEFT JOIN sys.database_principals imp ON imp.[principal_id] = PERM.[major_id]
    WHERE princ.[type] IN (
    		'S'
    		,'U'
    		,'G'
    		)
    	AND -- No need for these system accounts
    	princ.[name] NOT IN (
    		'sys'
    		,'INFORMATION_SCHEMA'
    		)
    ORDER BY ulogin.[name]
    	,[UserType]
    	,[DatabaseUserName]
    	,[Role]
    	,[PermissionState]
    	,[PermissionType]
    	,[ObjectType]
    	,[ObjectName]
    	,[ColumnName]
    ;

    Parece que esto sería suficiente para crear instrucciones "GRANT ... ON ... TO ...".


    Jose R. MCP
    Code Samples

    • Marcado como respuesta CMAPM jueves, 1 de marzo de 2018 13:39
    miércoles, 28 de febrero de 2018 17:15

Todas las respuestas

  • No creo que sea posible de menos no recuerdo haber visto jamas algo asi.

    Blog: www.sqlservertoolbox.blogspot.com.mx

    miércoles, 28 de febrero de 2018 17:00
  • No soy DBA así que no suelo hacer este tipo de cosas.  Buscando un poco encontré una consulta que parece proveer todo lo necesario para crear SQL dinámico.

    SELECT [UserName] = ulogin.[name]
    	,[UserType] = CASE princ.[type]
    		WHEN 'S'
    			THEN 'SQL User'
    		WHEN 'U'
    			THEN 'Windows User'
    		WHEN 'G'
    			THEN 'Windows Group'
    		END
    	,[DatabaseUserName] = princ.[name]
    	,[Role] = NULL
    	,[PermissionState] = PERM.[state_desc]
    	,[PermissionType] = PERM.[permission_name]
    	,[ObjectType] = CASE PERM.[class]
    		WHEN 1
    			THEN obj.type_desc -- Schema-contained objects
    		ELSE PERM.[class_desc] -- Higher-level objects
    		END
    	,[ObjectName] = CASE PERM.[class]
    		WHEN 1
    			THEN OBJECT_NAME(PERM.major_id) -- General objects
    		WHEN 3
    			THEN schem.[name] -- Schemas
    		WHEN 4
    			THEN imp.[name] -- Impersonations
    		END
    	,[ColumnName] = col.[name]
    FROM --database user
    	sys.database_principals princ
    LEFT JOIN --Login accounts
    	sys.server_principals ulogin ON princ.[sid] = ulogin.[sid]
    LEFT JOIN --Permissions
    	sys.database_permissions PERM ON PERM.[grantee_principal_id] = princ.[principal_id]
    LEFT JOIN --Table columns
    	sys.columns col ON col.[object_id] = PERM.major_id
    	AND col.[column_id] = PERM.[minor_id]
    LEFT JOIN sys.objects obj ON PERM.[major_id] = obj.[object_id]
    LEFT JOIN sys.schemas schem ON schem.[schema_id] = PERM.[major_id]
    LEFT JOIN sys.database_principals imp ON imp.[principal_id] = PERM.[major_id]
    WHERE princ.[type] IN (
    		'S'
    		,'U'
    		,'G'
    		)
    	AND -- No need for these system accounts
    	princ.[name] NOT IN (
    		'sys'
    		,'INFORMATION_SCHEMA'
    		)
    ORDER BY ulogin.[name]
    	,[UserType]
    	,[DatabaseUserName]
    	,[Role]
    	,[PermissionState]
    	,[PermissionType]
    	,[ObjectType]
    	,[ObjectName]
    	,[ColumnName]
    ;

    Parece que esto sería suficiente para crear instrucciones "GRANT ... ON ... TO ...".


    Jose R. MCP
    Code Samples

    • Marcado como respuesta CMAPM jueves, 1 de marzo de 2018 13:39
    miércoles, 28 de febrero de 2018 17:15