移动数据库(备份,恢复)后,我必须重新添加用户

xpd*_*pda 52 sql-server backup

我偶尔会使用 SQL Server Management Studio 中的数据库备份和还原将数据库 (SQL Express 2012) 从开发机器移动到服务器,反之亦然。

每当我这样做时,目标计算机上的应用程序都无法访问数据库,直到我从数据库用户(SQL Server Management Studio 中的数据库、安全性、用户)中删除他们使用的用户“george”并将其重新添加为安全、登录、乔治/属性、用户映射下的所有者。

有一个更好的方法吗?好像有点绕。

Mik*_*Fal 67

这是登录名用户之间的区别以及它们之间的关系:

  • 登录名 - 允许实体连接到 SQL Server 实例的实例级主体。就其性质而言,它们不会授予对实例上数据库的任何访问权限。例外情况是具有 sysadmin 权限的登录可以使用数据库,因为他们是 sysadmin,但因为 sysadmin 级别的权限。
  • 用户 - 允许实体连接到 SQL Server 数据库的数据库级主体。用户通过 SID 与登录关联,在两者之间创建关系并允许登录连接到实例,然后使用关联的用户连接到数据库。

SQL 验证登录名和数据库用户在还原时通常会发生的情况是 SIDS 将不同步,从而破坏关系。必须先修复此关系,然后才能使用该登录名连接到数据库,因为在 SQL Server 眼中,这些主体已不再连接。您可以使用以下 SQL 修复此问题:

ALTER USER [foo] WITH LOGIN=[foo]
Run Code Online (Sandbox Code Playgroud)

您可以在数据库的上下文中使用以下查询来检查孤儿:

select
    dp.name [user_name]
    ,dp.type_desc [user_type]
    ,isnull(sp.name,'Orhphaned!') [login_name]
    ,sp.type_desc [login_type]
from   
    sys.database_principals dp
    left join sys.server_principals sp on (dp.sid = sp.sid)
where
    dp.type in ('S','U','G')
    and dp.principal_id >4
order by sp.name
Run Code Online (Sandbox Code Playgroud)


小智 6

是一个对我有用的解决方案。它的作用是:

  1. 列出孤立用户:EXEC sp_change_users_login 'REPORT'
  2. 修复用户:EXEC sp_change_users_login 'UPDATE_ONE','<userName>','<userName>'