Sql server 2005 登录SQL Server中数据库的dbo

Sql server 2005 登录SQL Server中数据库的dbo,sql-server-2005,sql-server-2008,shared-hosting,Sql Server 2005,Sql Server 2008,Shared Hosting,我正在尝试从SQL Server 2005迁移到SQL Server 2008。这两个数据库实例都托管在我没有完全权限访问的第三方共享服务器上。他们正在使用混合模式身份验证 我在设置新数据库时遇到了麻烦,与旧数据库的设置方式相同。具体来说,新的基于web的控制面板不允许在创建新数据库时指定dbo,然后在使用Red Gate SQL Compare同步模式时也不允许指定dbo。我遇到了一些问题,因为某些对象(在脚本中没有显式指定dbo)是使用用户帐户前缀而不是dbo创建的 我翻阅了大量文档,试图找

我正在尝试从SQL Server 2005迁移到SQL Server 2008。这两个数据库实例都托管在我没有完全权限访问的第三方共享服务器上。他们正在使用混合模式身份验证

我在设置新数据库时遇到了麻烦,与旧数据库的设置方式相同。具体来说,新的基于web的控制面板不允许在创建新数据库时指定dbo,然后在使用Red Gate SQL Compare同步模式时也不允许指定dbo。我遇到了一些问题,因为某些对象(在脚本中没有显式指定dbo)是使用用户帐户前缀而不是dbo创建的

我翻阅了大量文档,试图找到一种方法,将我的“user1”作为dbo登录到“db1”数据库。我得出结论,剧本应该是这样的:

ALTER AUTHORIZATION ON DATABASE::db1 TO user1
在运行此脚本之前,登录名“user1”已经存在,但不是数据库“db1”的用户。注意:为了运行它,我必须将这个脚本提交给我的托管公司的支持。根据托管公司的说法,该语句已成功执行,但是,当我使用SQL compare比较数据库时,用户“user1”并没有像在SQL Server 2005下那样实际添加到数据库中。尝试使用脚本添加时:

CREATE USER [user1] FOR LOGIN [user1] WITH DEFAULT_SCHEMA=[dbo]
我收到错误消息:

"The login already has an account under a different username"
我已经尝试从数据库中删除所有其他用户,但错误消息仍然存在——我觉得这很奇怪

虽然我可以通过显式指定dbo来修复脚本,但这将不可避免地成为一颗等待引爆的定时炸弹,因为如果引入任何未显式指定dbo的新脚本,则在同步过程中会出现故障。因为有些脚本来自第三方,所以这不是一个好的解决方案

所以我的问题是:为了将“user1”作为dbo用户添加到数据库中,是否还需要运行另一条语句?SQL Server 2005和SQL Server 2008 R2之间的实现中是否存在任何可能导致这些不一致的更改

不幸的是,我无法通过测试找到第二个问题的答案,因为我没有其他SQL Server 2008数据库可供测试,而且我没有对该数据库执行任何操作的完全访问权限


旧数据库是通过一个控制面板创建的,该控制面板强制指定dbo,而新数据库在创建数据库时不允许指定dbo。

根据我收集的信息,以下内容就足够了

ALTER USER [user1] WITH DEFAULT_SCHEMA=[dbo]

create无法正常工作。

因此[user1]是sql server级别的登录,可以在master.dbo.syslogins中看到,而[database].dbo.sysusers中没有具有相同SID的用户。感谢您的帮助。是的,确实如此。我该怎么办呢?今天早上我又看了一遍,我成功地重现了同样的错误。然而,你已经说过你已经“删除了所有其他用户”。。。您是否已在数据库中删除user1并重新创建了它?请尝试以下代码查看登录名和用户之间的所有映射“选择l.name作为ServerLoginName,选择u.name作为DatabaseUserName从[database].dbo.sysusers u join master.dbo.syslogins l on u.sid=l.sid”否,我以前没有删除“user1”。我运行了查询,得到了1个结果-ServerLoginName:user1,DatabaseUserName:dbo。我想这就解释了为什么我不能创建db用户。我在生产环境中运行了相同的查询,数据库用户名是“user1”,而不是“dbo”。我发现这更好地解释了这个问题-我当前的登录名没有映射到“dbo”,而是sysadmin角色的成员。现在,只需编写一个脚本,使登录名成为sysadmin的成员,但目前我不知道如何做到这一点。哦,我猜生产用户不是sysadmin的成员(运行sp_helpsrvrolemember进行检查)。在这种情况下,我不知道老用户如何创建前缀为“dbo”的对象。然而,由于我的新登录名映射到“dbo”,它在功能上应该与旧用户相同——我想我可以创建一个生产数据库的副本,修改用户以匹配新服务器,然后我就可以从副本中同步模式(理论上)。这与我已有的有什么不同?我的意思是,“user1”已经是dbo了,对吗?提供默认模式dbo在功能上是否等同于将用户作为dbo(关于创建对象)?除非您担心在user1模式下创建新表/函数,这就是您声明必须显式声明dbo的原因。[tablename]。通过将默认模式设置为dbo,那么您就不需要在createstatosok中表达dbo了,我使用sqlcompare测试了这个方法,它成功了——这确实是2005服务器表现得如此的原因。此外,如果以这种方式更新数据库,则运行任何我没有运行权限的SQL脚本不需要支持请求。