2015-06-17 2 views
-1

Я делаю базу данных из файла резервной копии (я буду называть это db 1), и мне нужно дублировать пользователей одной базы данных (и этого db 2) на недавно восстановленная база данных.Как скопировать всех пользователей базы данных из одной базы данных в другую

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

Каков правильный способ скопировать пользователей с db 2 на db 1?

+1

Возможно, вам повезло больше на http://dba.stackexchange.com/ - тем временем: это две базы данных на одном сервере SQL? (это упрощает) .... (подсказка: SELECT .... FROM sys.sysusers) – Stan

+0

Да, они находятся на одном сервере. Я собирался сделать выбор вставки из sys.sysusers, но я не был уверен, будут ли какие-либо нежелательные побочные эффекты от этого. Есть ли какие-либо предвидимые побочные эффекты от этого? Также мне нужно обновить sys.database_principals? – user1058367

ответ

1

Вы не можете просто использовать конструкцию INSERT .... SELECT.

Вам необходимо использовать информацию sys.users для создания операторов CREATE USER и выполнения этих операторов.

Если это один раз вещь, я хотел бы использовать

select 'CREATE USER [' + uu.name + '] FOR LOGIN ' + ll.name + ' ;' 
from sys.sysusers uu 
    join master.sys.syslogins ll on ll.sid = uu.sid 

затем захватить выход, вставьте вывод в партию и запустить эту партию - быстро и легко одноразовым.

Если вам нужно сделать это в автоматическом режиме, вы можете использовать курсор:

USE DB2 -- the source of the users 
DECLARE cursCol CURSOR FAST_FORWARD FOR 
    select 'CREATE USER [' + uu.name + '] FOR LOGIN ' + ll.name + ' ;' 
from sys.sysusers uu 
    join master.sys.syslogins ll on ll.sid = uu.sid 

DECLARE @cmdString varchar(max) --for storing the first half of INSERT statement 
OPEN cursCol 
USE DB1 -- the target of the created users 
FETCH NEXT FROM cursCol INTO @cmdString; 
WHILE @@FETCH_STATUS=0 BEGIN 
    PRINT @cmdString; 
    EXEC (@cmdString); 

    FETCH NEXT FROM cursCol INTO @cmdString; 
END 
CLOSE cursCol 
DEALLOCATE cursCol 

Если это не тот же самый сервер, вы бы больше скрипт для генерации, но он все еще может сделайте.

+1

Вам нужна часть для работы с существующими пользователями? – Stan

+0

Это отличный ответ. Спасибо за ясность. – user1058367

+1

просто добавил пару строк, чтобы прояснить исходную/целевую часть db - также может полностью квалифицировать предложение FROM: 'db2.sys.sysusers' – Stan

Смежные вопросы