Скрипт SQL Права доступа к базе данных сервера - PullRequest
0 голосов
/ 13 апреля 2020

Мне нужно скопировать разрешения из одной базы данных в другую на том же сервере. Мне удалось создать скрипт создания разрешений и пользователей. Когда я пытаюсь создать разрешения без пользователей, возникает ошибка, что такого пользователя не существует. Поэтому я добавил скрипт, который также создает пользователей. Но при запуске он выдает ошибку для некоторых пользователей:

'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); 
...