我偶尔会使用sql Server Management Studio中的数据库备份和还原将数据库(sql Express 2012)从开发计算机移动到服务器,反之亦然.
每当我执行此操作时,目标计算机上的应用程序无法访问数据库,直到我从数据库用户(数据库,安全性,sql Server Management Studio中的用户)中删除他们使用的用户“george”,并将其重新添加为安全,登录,george / properties,用户映射下的所有者.
有一个更好的方法吗?这看起来有点令人费解.
解决方法
这是
logins和
users之间的差异以及它们之间的关系:
>登录 – 允许实体连接到sql Server实例的实例级主体.它们本质上不授予对实例上的数据库的任何访问权限.一个例外是具有sysadmin权限的登录可以使用数据库,因为它们是sysadmin,但是由于sysadmin级别权限.
> Users – 允许实体连接到sql Server数据库的数据库级主体.用户通过SID与登录相关联,在两者之间创建关系并允许登录连接到实例,然后使用关联的用户连接到数据库.
在还原时,sql身份验证登录和数据库用户通常会发生的事情是SIDS将不同步,从而破坏了关系.必须先修复此关系,然后才能使用该登录连接到数据库,因为在sql Server眼中,这些主体不再连接.您可以使用以下sql修复此问题:
ALTER USER [foo] WITH LOGIN=[foo]
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