Мне нужно скопировать разрешения из одной базы данных в другую на том же сервере. Мне удалось создать скрипт создания разрешений и пользователей. Когда я пытаюсь создать разрешения без пользователей, возникает ошибка, что такого пользователя не существует. Поэтому я добавил скрипт, который также создает пользователей. Но при запуске он выдает ошибку для некоторых пользователей:
'xxx' не является действительным логином или у вас нет разрешения
Так что я погуглил эту ошибку и кажется, что эти пользователи должны быть каким-то образом назначены для некоторого входа Как включить эти логины в скрипт и избавиться от ошибки?
Или, может быть, есть способ скопировать разрешения без пользователей, и я слишком усложняю задачу?
USE DatabaseToCopyFrom
GO
DECLARE @sql_users VARCHAR(max)
SET @sql_users = 'USE DatabaseToCopyTo; ';
SELECT @sql_users += 'CREATE USER [' + NAME + '] FOR LOGIN [' + NAME
+ '];'
FROM sys.database_principals
WHERE type IN ( 'U', 'S' )
AND NAME NOT IN ( 'dbo', 'guest', 'sys', 'INFORMATION_SCHEMA' )
DECLARE @sql_permissions VARCHAR(max);
SET @sql_permissions = 'USE Txu; ';
SELECT @sql_permissions += CASE WHEN DBP.state <> 'W' THEN DBP.state_desc ELSE
'GRANT'
END + Space(1) +
DBP.permission_name + Space(1)
+ Space(1) + 'TO' + Space(1) + Quotename(USR.NAME)
COLLATE
database_default + CASE
WHEN DBP.state <> 'W' THEN Space(0)
ELSE Space(1) + 'WITH GRANT OPTION'
END + ';'
FROM sys.database_permissions AS DBP
INNER JOIN sys.database_principals AS USR
ON DBP.grantee_principal_id = USR.principal_id
WHERE DBP.major_id = 0
AND USR.NAME <> 'dbo'
ORDER BY DBP.permission_name ASC,
DBP.state_desc ASC
PRINT @sql_users;
EXEC (@sql_users);
PRINT @sql_permissions;
EXEC (@sql_permissions);