【问题标题】:SQL Server Enterprise Manager - Mass Delete of Tables and Changing Ownership of TablesSQL Server 企业管理器 - 批量删除表和更改表的所有权
【发布时间】:2011-04-13 18:26:21
【问题描述】:

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

在导入数据库期间,发生了一些事情,每个表都重复了自己,但有两个重要的区别。

第一个是两个表上的 Owner 不同,第二个是其中一个副本上只复制了结构。

Sod 定律表明数据当然存储在错误的人拥有的表上,所以我的问题是我是否可以快速删除一个用户拥有的所有表,我是否可以快速更改所有其他表的所有权以将它们带来排队。

有足够多的表格,自动化将是我长期的首选!

【问题讨论】:

  • SQL Server 的版本? (我假设是 2000 年,因为 Enterprise Manager,但可以肯定的是)
  • @Martin,是的,2000 年,抱歉,我现在将编辑我的帖子。
  • 不要忘记解决为什么会发生这种情况,这样问题就不会重新出现。我编写了所有创建脚本,专门将 dbo 指定为所有者(或在较新的版本中,我们要用于表的模式)。我们所有的开发人员都应该这样做,这是我们代码审查过程的一部分。

标签: sql sql-server ssms sql-server-2000


【解决方案1】:
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

【讨论】:

  • 这将使选择重复表、删除空表和更改所有权的整个过程自动化。您只需要更改顶部的两个 Owner 变量即可。
【解决方案2】:

有关更改所有权,请参阅:SQL Table Ownership Changes, Quick and Easy

上面链接给出的代码是:

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

【讨论】:

  • 这将有助于解决一个难题,但它无助于删除额外的表格。这也将改变所有表的所有权,而不仅仅是重复的表(尽管这可能没问题。)
  • 正如我所提到的(在我帖子的前 3 个字中),这是为了解决问题的所有权部分的变化。您是正确的,应该首先删除坏表。
  • 因为完全不同的用户在玩,所以顺序并不那么重要。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多