T-SQL - 如何复制数据库并保持安全设置不变?

时间:2011-11-17 21:05:56

标签: tsql

我有一个SQL 2005 Express数据库,其安全性配置为在我的开发机器上进行Windows身份验证。有时我需要将其复制到使用SQL身份验证的SQL 2008 R2测试服务器。我尝试在测试服务器上分离和附加开发副本,以及在测试服务器上恢复开发备份,但在这两种情况下,我之前配置的SQL帐户的角色成员资格和权限都丢失了,我必须重新配置它们。

有没有办法将数据库复制到测试服务器并在恢复/附加后保持现有的SQL用户安全配置不变?

谢谢!

2 个答案:

答案 0 :(得分:4)

您可能遇到称为“孤儿用户”的问题,which is discussed in this Mircosoft article

基本上,用户存在于数据库中,并且登录存在于服务器上,但SPID不匹配,因此在数据库还原或连接到服务器时,用户与登录无关。 / p>

正如文章中所讨论的,sp_change_users_login存储过程可用于解析单个登录,以下脚本将尝试自动修复数据库中的所有用户:

IF EXISTS(SELECT * FROM tempdb..sysobjects WHERE id = object_id('tempdb..#t_users'))
    drop table #t_users

CREATE TABLE #t_users ( [name] SYSNAME)

INSERT #t_users ( [name] )
SELECT [name] 
FROM sysusers 
WHERE 
    islogin = 1 
    AND name NOT IN ('dbo', 'public', 'guest', 'sys', 'INFORMATION_SCHEMA')  
order by name

DECLARE @lc_name SYSNAME

SET @lc_name = (SELECT MIN([name]) FROM #t_users)
WHILE @lc_name IS NOT NULL
BEGIN
    IF EXISTS(SELECT * FROM master..syslogins WHERE [name] = @lc_name)
    BEGIN
        EXEC sp_change_users_login 'AUTO_FIX', @lc_name
        PRINT 'fixing ' + @lc_name
    END
    ELSE
        PRINT '*** not fixing ' + @lc_name

    SET @lc_name = (SELECT MIN([name]) FROM #t_users WHERE [name] > @lc_name )
END

答案 1 :(得分:2)

不确定: SSMS GUI有一个快速复制用户的方法:,任务,生成脚本....,选择“用户”。

这是另一种选择:

http://support.microsoft.com/default.aspx?scid=kb;en-us;246133