如何在 SQL Server 2008 R2 中克隆用户?

swe*_*itz 25 sql-server-2008 sql-server permissions ssms

有没有办法在 Microsoft SQL Server 中克隆用户的安全性和权限,最好使用 SQL Server Management Studio GUI?

Kin*_*hah 40

注意: 下面的脚本实际上并没有设置任何权限,它只是创建可以复制并粘贴到新查询的脚本,然后可以在执行之前对其进行编辑。

下面的脚本将帮助您将一个用户的权限复制/克隆到另一个:

--- To copy permissions of one user/role to another user/role.

USE database_name -- Use the database from which you want to extract the permissions
GO


SET NOCOUNT ON
DECLARE @OldUser sysname, @NewUser sysname

SET @OldUser = 'userOLD' --The user or role from which to copy the permissions from
SET @NewUser = 'userNEW'  --The user or role to which to copy the permissions to


SELECT  'USE' + SPACE(1) + QUOTENAME(DB_NAME()) AS '--Database Context'


SELECT  '--Cloning permissions from' + SPACE(1) + QUOTENAME(@OldUser) + SPACE(1) + 'to' + SPACE(1) + QUOTENAME(@NewUser) AS '--Comment'


SELECT  'EXEC sp_addrolemember @rolename ='
    + SPACE(1) + QUOTENAME(USER_NAME(rm.role_principal_id), '''') + ', @membername =' + SPACE(1) + QUOTENAME(@NewUser, '''') AS '--Role Memberships'
FROM    sys.database_role_members AS rm
WHERE   USER_NAME(rm.member_principal_id) = @OldUser
ORDER BY rm.role_principal_id ASC


SELECT  CASE WHEN perm.state <> 'W' THEN perm.state_desc ELSE 'GRANT' END
    + SPACE(1) + perm.permission_name + SPACE(1) + 'ON ' + QUOTENAME(SCHEMA_NAME(obj.schema_id)) + '.' + QUOTENAME(obj.name)
    + CASE WHEN cl.column_id IS NULL THEN SPACE(0) ELSE '(' + QUOTENAME(cl.name) + ')' END
    + SPACE(1) + 'TO' + SPACE(1) + QUOTENAME(@NewUser) COLLATE database_default
    + CASE WHEN perm.state <> 'W' THEN SPACE(0) ELSE SPACE(1) + 'WITH GRANT OPTION' END AS '--Object Level Permissions'
FROM    sys.database_permissions AS perm
    INNER JOIN
    sys.objects AS obj
    ON perm.major_id = obj.[object_id]
    INNER JOIN
    sys.database_principals AS usr
    ON perm.grantee_principal_id = usr.principal_id
    LEFT JOIN
    sys.columns AS cl
    ON cl.column_id = perm.minor_id AND cl.[object_id] = perm.major_id
WHERE   usr.name = @OldUser
ORDER BY perm.permission_name ASC, perm.state_desc ASC


SELECT  CASE WHEN perm.state <> 'W' THEN perm.state_desc ELSE 'GRANT' END
    + SPACE(1) + perm.permission_name + SPACE(1)
    + SPACE(1) + 'TO' + SPACE(1) + QUOTENAME(@NewUser) COLLATE database_default
    + CASE WHEN perm.state <> 'W' THEN SPACE(0) ELSE SPACE(1) + 'WITH GRANT OPTION' END AS '--Database Level Permissions'
FROM    sys.database_permissions AS perm
    INNER JOIN
    sys.database_principals AS usr
    ON perm.grantee_principal_id = usr.principal_id
WHERE   usr.name = @OldUser
AND perm.major_id = 0
ORDER BY perm.permission_name ASC, perm.state_desc ASC
Run Code Online (Sandbox Code Playgroud)

  • @sweetritz 如果有用于克隆用户的 GUI,您就不需要问这个问题,因为您只需按下按钮即可。没有。仅仅因为你“不擅长代码”并不是不学习变得更好的借口...... (13认同)
  • 不要让自己仅限于使用 GUI。GUI 适合新手,但也有局限性。对于您的任务,上面的脚本只会生成 ** 可用于创建/克隆用户的实际脚本**。 (6认同)
  • 我认为需要明确的是,运行上述脚本实际上并没有设置任何权限,它只是创建了可以复制并粘贴到新查询的脚本,然后可以在执行之前对其进行编辑。我自己刚用过,效果很好!伟大的节省时间!! (2认同)
  • @AlanFisher 感谢您的评论,很高兴它对您有所帮助。更新了我的答案以反映您的评论。谢谢 ! (2认同)