2011-04-11 79 views
1

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

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

我已经倾注了文档,试图找到一种方法来强制我的登录“user1”作为dbo到“db1”数据库。我得出的结论是,脚本应该是这样的:

ALTER AUTHORIZATION ON DATABASE::db1 TO user1 

之前运行此脚本时,登录“user1”已经存在,但不是数据库“DB1”的用户。注意我必须将此脚本提交给我的托管公司的支持才能运行它。根据托管公司声明成功执行,但是当我比较使用SQL的数据库比较用户“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。

+0

因此[user1]是一个sql server级别的登录名,可以在master.dbo.syslogins中看到,并且[database] .dbo.sysusers中没有用户具有相同的sid – AgentDBA 2011-04-11 15:34:05

+0

感谢您的帮助。是的,情况就是如此。我从哪里出发? – NightOwl888 2011-04-11 15:57:54

+0

今天早上刚刚再次看到这一点,我设法重现了同样的错误。不过,你已经说过你已经“把所有其他用户都丢掉了......”你是否已经把user1放在数据库上并重新创建了它?请尝试以下代码以查看登录名和用户之间的所有映射:“将l.name作为ServerLoginName,将u.name作为DatabaseUserName从[数据库] .dbo.sysusers中选择u在主服务器上加入master.dbo.syslogins l对u.sid = l.sid “ – AgentDBA 2011-04-12 07:43:21

回答

3

从我收集的以下应该就足够了。

ALTER USER [user1] WITH DEFAULT_SCHEMA=[dbo] 

该创建工作并不存在,因为它已经存在。

+0

这与我已有的有何不同?我的意思是,“user1”已经是dbo了,对吧?是否给出默认模式dbo在功能上等同于使用户成为dbo(关于创建对象)? – NightOwl888 2011-04-12 15:23:15

+0

,除非你担心在user1模式下创建新的表/函数,这就是为什么你声明你不得不明确声明dbo。[tablename]。通过将默认模式设置为dbo,那么您不需要在创建语句中表达dbo – AgentDBA 2011-04-12 15:25:47

+0

好吧,我使用SQL Compare测试了这种方法,它的工作原理 - 这确实是2005服务器的原因。另外,如果数据库以这种方式更新,它不需要支持请求来运行我没有权限运行的任何SQL脚本。 – NightOwl888 2011-04-12 16:06:12

相关问题