Umbraco - 移动服务器,数据库问题

时间:2016-06-20 10:50:12

标签: sql-server umbraco

我已将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界面),我试过,它只是说它已经存在:/

此外(可能与此问题有关)前端根本不加载。我看到一个主机错误页面。后端加载非常奇怪。

1 个答案:

答案 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的成员已修复   数据库角色):

     
      
  1. 属于创建对象的用户,而不是dbo。
  2.   
  3. 使用创建对象的用户的名称进行限定。
  4.   

如果您的所有表都归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中的语句   服务器查询分析器。

来源:https://support.microsoft.com/en-us/kb/275312