SQL Server Enterprise Manager-大量删除表并更改表的所有权

SQL Server Enterprise Manager-大量删除表并更改表的所有权,sql,sql-server,sql-server-2000,enterprise-manager,Sql,Sql Server,Sql Server 2000,Enterprise Manager,我几乎没有使用SQL Server企业管理器的经验,所以我不确定这是否可行(或者说,希望是非常简单的!) 在导入到数据库的过程中,发生了一些事情,其中每个表都复制了自己,但有两个重要的区别 第一个是两个表的所有者不同,第二个是只有结构在其中一个副本上进行了复制 Sod定律表明,数据当然存储在错误的人拥有的表上,因此我的问题是,我能否快速删除一个用户拥有的所有表,并快速更改所有其他表的所有权以使它们保持一致 有足够多的表,自动化将是我的首选选择了很长一段路 非常感谢您的帮助,我正在运行SQL Se

我几乎没有使用SQL Server企业管理器的经验,所以我不确定这是否可行(或者说,希望是非常简单的!)

在导入到数据库的过程中,发生了一些事情,其中每个表都复制了自己,但有两个重要的区别

第一个是两个表的所有者不同,第二个是只有结构在其中一个副本上进行了复制

Sod定律表明,数据当然存储在错误的人拥有的表上,因此我的问题是,我能否快速删除一个用户拥有的所有表,并快速更改所有其他表的所有权以使它们保持一致

有足够多的表,自动化将是我的首选选择了很长一段路


非常感谢您的帮助,我正在运行SQL Server 2000以更改所有权,请参阅:

上述链接中给出的代码为:

DECLARE @old sysname, @new sysname, @sql varchar(1000)

SELECT
  @old = 'oldOwner_CHANGE_THIS'
  , @new = 'dbo'
  , @sql = '
  IF EXISTS (SELECT NULL FROM INFORMATION_SCHEMA.TABLES
  WHERE
      QUOTENAME(TABLE_SCHEMA)+''.''+QUOTENAME(TABLE_NAME) = ''?''
      AND TABLE_SCHEMA = ''' + @old + '''
  )
  EXECUTE sp_changeobjectowner ''?'', ''' + @new + ''''

EXECUTE sp_MSforeachtable @sql

SQL Server的版本?(我估计是2000年,因为企业经理,但只是为了确定)@Martin,是的,2000年,对不起,我现在就编辑我的帖子;Don’别忘了修复为什么会发生这种情况,这样问题就不会重新出现。我编写所有创建脚本,指定dbo作为所有者(或者在较新版本中,schemawe希望用于表)。我们所有的开发人员都应该这样做,这是我们代码检查过程的一部分。这有助于解决一个难题,但无助于删除额外的表。此外,这将改变所有表的所有权,而不仅仅是重复的表(尽管这可能没问题)。正如我所提到的(在我文章的前三个字中),这是为了解决问题的所有权变更部分。你说得对,坏桌子可能应该先扔掉。非常感谢,节省了我很多时间!由于用户完全不同,所以顺序并不重要。这将自动完成选择重复表、删除空表和更改所有权的整个过程。您只需要更改顶部的两个所有者变量。非常好,非常感谢。你是在飞行中写的还是以前做过类似的事情?
declare @emptyOwner varchar(20)
declare @wrongOwner varchar(20)
declare @emptyOwnerID bigint
declare @wrongOwnerID bigint
declare @tableName nvarchar(255)

set @emptyOwner = 'dbo'
set @wrongOwner = 'guest'

select @emptyOwnerID = (select uid from sysusers where name = @emptyOwner)
select @wrongOwnerID = (select uid from sysusers where name = @wrongOwner)

select name as tableName
into #tempTable
from systables
where type='U'
and exists (select 1 from systables where type = 'U' and uid = @emptyOwnerID)
and exists (select 1 from systables where type = 'U' and uid = @wrongOwnerID)

declare @dynSQL nvarchar(MAX)

declare ownme cursor for
  select tableName from #tempTable

open ownme
fetch next from ownme into @tableName

while @@FETCH_STATUS = 0
begin
    @dynSQL = 'DROP TABLE [' + @emptyOwner + '].[' + @tableName + ']'
    exec(@dynSQL)

    @dynSQL = 'sp_changeobjectowner ''[' + @wrongOwner + '].[' + @tableName + ']'',''' + @emptyOwner + ''''
    exec(@dynSQL)

    fetch next from ownme into @tableName
end

close ownme
deallocate ownme