数据库升级或者是转移后出现对象名 'dnt_online' 无效等类似问题发布时间:2011/8/31 1:12:00 阅读次数:

  

  出现这个问题的一个原因可能是数据连接用户不是当前的数据库的拥有者。出现这种情况的原因可能是在执行建库\表sql时使用了不同的登录角色造成。此问题官方有解决方案,具体方法如下,也可以直接访问官方的帖子:http://nt.discuz.net/showtopic-37487.aspx 1 单个修改拥有者,针对单个的数据表或者视图、存储过程等独立对象 exec sp_changeobjectowner '[所有者].[对象名]', 'dbo' 例子: exec sp_changeobjectowner '[test].[dnt_users]', 'dbo' 执行后 数据库中dnt_users表的所有者从test变为dbo 2 批量修改   2.1 现在查询分析其中执行 下面的sql语句 建立名为changename存储过程

  CREATE PROCEDURE dbo.changename

  @OldOwner as NVARCHAR(128),--参数原所有者

  @NewOwner as NVARCHAR(128)--参数新所有者

  AS

  DECLARE @Name as NVARCHAR(128)

  DECLARE @Owner as NVARCHAR(128)

  DECLARE @OwnerName as NVARCHAR(128)

  DECLARE curObject CURSOR FOR

  select 'Name' = name,

  'Owner' = user_name(uid)

  from sysobjects

  where user_name(uid)=@OldOwner

  order by name

  OPEN curObject

  FETCH NEXT FROM curObject INTO @Name, @Owner

  WHILE(@@FETCH_STATUS=0)

  BEGIN

  if @Owner=@OldOwner

  begin

  set @OwnerName = @OldOwner + '.' + rtrim(@Name)

  exec sp_changeobjectowner @OwnerName, @NewOwner

  end

  FETCH NEXT FROM curObject INTO @Name, @Owner

  END

  close curObject

  deallocate curObject

  GO

  2.2 执行存储过程changename 例如 exec changename 'test','dbo' 则当前数据库中所有对象所有者 从 test 变为 dbo。

  2.3 还有个需要注意的情况

  在做BBS系统的时候,把别人数据库的数据备份到我的数据库时,有的就是不能打开。最后发现,在数据库的表中,建表的人员的名称是不一样的。这就影响数据对不同的执行者访问的时候权限问题,因此只好把别人的管理员身份改动一下,但是一是表很多 而且数据库还不让改动

  最后在查询分析器里面运行了下面的程序:

  Exec sp_configure 'allow updates',1  --允许更新系统表。

  RECONFIGURE WITH OVERRIDE

  DECLARE @DBName varchar(50),@UserName varchar(50),@Sql varchar(200)

  set @DBName='test'

  set @UserName='webmaster'

  set @Sql=N'update '+@DBName +N'.dbo.sysusers set sid = (select sid from master.dbo.syslogins where name='+quotename(@UserName,'''')+N') where name='+quotename(@UserName,'''')

  exec(@Sql)

  Exec sp_configure 'allow updates',0  --关闭系统表更新

  RECONFIGURE WITH OVERRIDE

  这个程序的核心是:

  set @DBName='原数据库名'

  set @UserName='原数据库帐号'

  这样就把原来的数据库的权限问题转化过来了