SQL Server 企业管理器 - 批量删除表和更改表的所有权
-
03-10-2019 - |
题
我几乎没有使用 SQL Server 企业管理器的经验,所以我不确定这是否可能(或者希望简单得可笑!)
在导入数据库的过程中,会发生一些情况,每个表都会自我复制,但有两个重要的区别。
第一个是两个表上的所有者不同,第二个是只有结构复制到其中一个副本上。
Sod 定律表明,数据当然存储在错误的人拥有的表上,所以我的问题是我是否可以快速删除一个用户拥有的所有表,并且可以快速更改所有其他表的所有权以使它们保持一致。
有足够多的桌子,自动化将成为我长期以来的首选!
任何帮助将不胜感激,我正在运行 SQL Server 2000
解决方案
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
其他提示
要更改所有权,请参阅: SQL 表所有权更改,快速而简单
上面链接中给出的代码是:
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
不隶属于 StackOverflow