| | Copy roles:
USE [database source name]
GO
DECLARE @role_name sysname,
@owner_name sysname
DECLARE Roles_Cursor CURSOR FOR
SELECT roles.name, owners.name FROM sys.database_principals roles
INNER JOIN sys.database_principals owners
ON roles.owning_principal_id = owners.principal_id
WHERE roles.type in (N'R')
OPEN Roles_Cursor
FETCH NEXT FROM Roles_Cursor
INTO @role_name, @owner_name
WHILE @@FETCH_STATUS = 0
BEGIN
IF NOT EXISTS (SELECT name FROM [database target name].sys.database_principals
WHERE name = @role_name)
BEGIN
DECLARE @sql nvarchar(1024)
SET @sql = N'
USE [database target name]
CREATE ROLE ['+ @role_name+N'] AUTHORIZATION ['+@owner_name + N']'
EXEC (@sql)
END
FETCH NEXT FROM Roles_Cursor
INTO @role_name, @owner_name
END
CLOSE Roles_Cursor;
DEALLOCATE Roles_Cursor;
GO
Copy users:
USE [database source name]
GO
DECLARE @user_name sysname,
@schema_name sysname
DECLARE Users_Cursor CURSOR FOR
SELECT name, default_schema_name FROM sys.database_principals
WHERE type in (N'S', N'U')
OPEN Users_Cursor
FETCH NEXT FROM Users_Cursor
INTO @user_name, @schema_name
WHILE @@FETCH_STATUS = 0
BEGIN
IF NOT EXISTS (SELECT name FROM [database target name].sys.database_principals
WHERE name = @user_name)
BEGIN
DECLARE @sql nvarchar(1024)
SET @sql = N'
USE [database target name]
CREATE USER ['+ @user_name+N'] FOR LOGIN ['+@user_name + N']'
IF NOT (@schema_name IS NULL)
SET @sql = @sql + N'WITH DEFAULT_SCHEMA=[' + @schema_name + N']'
EXEC (@sql)
END
FETCH NEXT FROM Users_Cursor
INTO @user_name, @schema_name
END
CLOSE Users_Cursor;
DEALLOCATE Users_Cursor;
GO
Copy principals
USE [database source name]
GO
DECLARE @role_name sysname,
@member_name sysname
DECLARE RoleMember_Cursor CURSOR FOR
SELECT role_principals.name, member_principals.name FROM sys.database_role_members role_members
INNER JOIN sys.database_principals role_principals
ON role_members.role_principal_id = role_principals.principal_id
INNER JOIN sys.database_principals member_principals
ON role_members.member_principal_id = member_principals.principal_id
OPEN RoleMember_Cursor;
FETCH NEXT FROM RoleMember_Cursor
INTO @role_name, @member_name
WHILE @@FETCH_STATUS = 0
BEGIN
IF NOT EXISTS (
SELECT role_principals.name, member_principals.name FROM [database target name].sys.database_role_members role_members
INNER JOIN [database target name].sys.database_principals role_principals
ON role_members.role_principal_id = role_principals.principal_id
INNER JOIN [database target name].sys.database_principals member_principals
ON role_members.member_principal_id = member_principals.principal_id
WHERE
role_principals.name = @role_name AND
member_principals.name = @member_name)
BEGIN
EXEC [database target name].sys.sp_addrolemember @role_name, @member_name
END
FETCH NEXT FROM RoleMember_Cursor
INTO @role_name, @member_name
END
CLOSE RoleMember_Cursor;
DEALLOCATE RoleMember_Cursor;
GO
Copy permissions
USE [database source name]
GO
DECLARE @grantee_name sysname,
@grantor_name sysname,
@permission_name sysname,
@grant_state nvarchar
DECLARE Permissions_Cursor CURSOR FOR
SELECT grantee_principals.name, grantor_principals.name, permission.permission_name, permission.state FROM sys.database_permissions permission
INNER JOIN sys.database_principals grantee_principals
ON permission.grantee_principal_id = grantee_principals.principal_id
INNER JOIN sys.database_principals grantor_principals
ON permission.grantor_principal_id = grantor_principals.principal_id
WHERE permission.state in (N'G', N'W')
OPEN Permissions_Cursor;
FETCH NEXT FROM Permissions_Cursor
INTO @grantee_name, @grantor_name, @permission_name, @grant_state
WHILE @@FETCH_STATUS = 0
BEGIN
IF NOT EXISTS (
SELECT grantee_principals.name, grantor_principals.name, permission.permission_name, permission.state FROM [database target name].sys.database_permissions permission
INNER JOIN [database target name].sys.database_principals grantee_principals
ON permission.grantee_principal_id = grantee_principals.principal_id
INNER JOIN [database target name].sys.database_principals grantor_principals
ON permission.grantor_principal_id = grantor_principals.principal_id
WHERE permission.state in (N'G', N'W')
AND
grantee_principals.name = @grantee_name AND
permission.permission_name = @permission_name)
BEGIN
DECLARE @sql nvarchar(1024),
@grant nvarchar(32)
IF (@grant_state in (N'W'))
SET @grant = N'WITH GRANT OPTION'
ELSE
SET @grant = N''
SET @sql = N'
USE [database target name]
BEGIN TRY
GRANT '+@permission_name+N' TO ['+@grantee_name+N'] '+@grant+N' AS ['+@grantor_name+N']
END TRY
BEGIN CATCH
GRANT '+@permission_name+N' TO ['+@grantee_name+N'] '+@grant+N'
END CATCH'
EXEC (@sql)
END
FETCH NEXT FROM Permissions_Cursor
INTO @grantee_name, @grantor_name, @permission_name, @grant_state
END
CLOSE Permissions_Cursor;
DEALLOCATE Permissions_Cursor;
GO
|