我已将Umbraco网站从旧服务器移动到新服务器。
我已经通过FTP完全复制了所有文件(并设置了正确的Umbraco权限),并恢复了SQL备份。
我编辑了web.config以使用新的SQL细节,我很容易进入后端(所有以前的数据,例如用户,页面等似乎都在那里)
但是,我收到以下消息:
直播运行Umbraco my_domain.preview.fastwebhosting.net。 使用“my_db_user”连接到DB my_db_name 用户。
警告!看起来您在LIVE服务器上但已连接到 UNKNOWN数据库。请检查web.config!
以前的数据库似乎有一个用户dbo。我无法在新服务器上重新创建此用户(使用主机Web界面),我试过,它只是说它已经存在:/
此外(可能与此问题有关)前端根本不加载。我看到一个主机错误页面。后端加载非常奇怪。
答案 0 :(得分:1)
dbo是SQL Server中的默认架构,在Microsoft Technet上描述如下:
dbo是具有执行所有权限的隐含权限的用户 数据库中的活动。 sysadmin固定服务器的任何成员 使用数据库的角色映射到每个内部的特殊用户 数据库名为dbo。此外,由任何成员创建的任何对象 sysadmin固定服务器角色自动属于dbo。
例如,如果用户Andrew是sysadmin固定服务器的成员 角色并创建一个表T1,T1属于dbo并且被认定为 dbo.T1,而不是Andrew.T1。相反,如果安德鲁不是其中的一员 sysadmin固定服务器角色但仅是已修复的db_owner的成员 数据库角色并创建一个表T1,T1属于安德鲁而且是 合格为Andrew.T1。该表属于安德鲁,因为他没有 将表限定为dbo.T1。
dbo用户无法删除,并且始终存在于每个数据库中。只有成员创建的对象 sysadmin固定服务器角色(或dbo用户)属于dbo。 由也不是其成员的任何其他用户创建的对象 sysadmin固定服务器角色(包括db_owner的成员已修复 数据库角色):
- 属于创建对象的用户,而不是dbo。
- 使用创建对象的用户的名称进行限定。
醇>
如果您的所有表都归dbo所有,那么您应该没问题,但我怀疑它们现在由您连接到数据库的用户所拥有。您可以将此类对象的所有权更改回dbo以避免出现问题,以下内容可能对此有所帮助,但请自行承担风险,因为如果它不适合您,我将不承担任何责任!
if exists (select * from sysobjects where id = object_id(N'[dbo].[chObjOwner]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[chObjOwner]
GO
SET QUOTED_IDENTIFIER OFF SET ANSI_NULLS ON
GO
CREATE proc chObjOwner( @usrName varchar(20), @newUsrName varchar(50))
as
-- @usrName is the current user
-- @newUsrName is the new user
set nocount on
declare @uid int -- UID of the user
declare @objName varchar(50) -- Object name owned by user
declare @currObjName varchar(50) -- Checks for existing object owned by new user
declare @outStr varchar(256) -- SQL command with 'sp_changeobjectowner'
set @uid = user_id(@usrName)
declare chObjOwnerCur cursor static
for
select name from sysobjects where uid = @uid
open chObjOwnerCur
if @@cursor_rows = 0
begin
print 'Error: No objects owned by ' + @usrName
close chObjOwnerCur
deallocate chObjOwnerCur
return 1
end
fetch next from chObjOwnerCur into @objName
while @@fetch_status = 0
begin
set @currObjName = @newUsrName + "." + @objName
if (object_id(@currObjName) > 0)
print 'WARNING *** ' + @currObjName + ' already exists ***'
set @outStr = "sp_changeobjectowner '" + @usrName + "." + @objName + "','" + @newUsrName + "'"
print @outStr
print 'go'
fetch next from chObjOwnerCur into @objName
end
close chObjOwnerCur
deallocate chObjOwnerCur
set nocount off
return 0
GO
SET QUOTED_IDENTIFIER OFF SET ANSI_NULLS ON
GO
要将用户test拥有的所有对象更改为dbo,请运行以下代码:
exec chObjOwner 'test','dbo'
代码查找test所拥有的所有对象并生成一个 通过使用sp_changeobjectowner存储的一系列SQL语句 程序。然后,您可以检查并运行SQL中的语句 服务器查询分析器。