Sql 如何将所有数据库用户从一个数据库复制到另一个数据库

Sql 如何将所有数据库用户从一个数据库复制到另一个数据库,sql,sql-server,database,Sql,Sql Server,Database,我正在从一个备份文件(我称之为DB1)创建一个数据库,我需要将一个数据库(以及这个DB2)的用户复制到新恢复的数据库 我知道必须执行的第一步是删除新恢复的数据库中的所有现有用户 将用户从db 2复制到db 1的正确方法是什么?您不能只使用插入。。。。选择构造 您需要使用sys.users信息生成CREATE USER语句并执行这些语句 如果这是一次性的,我会用 select 'CREATE USER [' + uu.name + '] FOR LOGIN ' + ll.name + ' ;' f

我正在从一个备份文件(我称之为DB1)创建一个数据库,我需要将一个数据库(以及这个DB2)的用户复制到新恢复的数据库

我知道必须执行的第一步是删除新恢复的数据库中的所有现有用户


将用户从db 2复制到db 1的正确方法是什么?

您不能只使用插入。。。。选择构造

您需要使用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

如果不是同一台服务器,您将有更多的脚本要生成,但仍然可以完成。

您可能会更幸运,同时:这两个数据库是否在同一台SQL server上?(这使它更容易)。。。。(提示:从sys.sysusers中选择…)是,它们位于同一服务器上。我本来打算从sys.sysusers执行insert-select操作,但我不确定这样做是否会产生任何不必要的副作用。这样做是否有任何可预见的副作用?我还需要更新sys.database_主体吗?您需要该部分来处理现有用户吗?这是一个很好的答案。感谢您的澄清。刚才添加了几行来澄清源/目标db部分-还可以完全限定FROM子句:
db2.sys.sysusers
I没有现有用户。现在,我只需要处理删除还原过程中产生的孤立用户的问题。您的意思是这样的:
SELECT'DROP USER['+uu.name+'];'从sys.sysusers uu LEFT OUTER join master.sys.syslogins ll on ll.sid=uu.sid,其中ll.sid为null