Como eu mudo o esquema db para dbo

115

Importei um monte de tabelas de um servidor sql antigo (2000) para meu banco de dados de 2008. Todas as mesas importados são prefixados com meu nome de usuário, por exemplo: jonathan.MovieData. Na tabela, propertiesele é listado jonathancomo o esquema db. Quando escrevo procedimentos armazenados, agora tenho que incluir jonathan.na frente de todos os nomes de tabelas, o que é confuso.

Como altero todas as minhas tabelas para dbo em vez de jonathan?

Resultado atual: jonathan.MovieData

Resultado desejado: dbo.MovieData

Jonathan Hall
fonte

Respostas:

179
ALTER SCHEMA dbo TRANSFER jonathan.MovieData;

Consulte ALTER SCHEMA .

Sintaxe generalizada:

ALTER SCHEMA TargetSchema TRANSFER SourceSchema.TableName; 
Remus Rusanu
fonte
12
Para economizar tempo dos Googlers: ALTER SCHEMA TargetSchema TRANSFER SourceSchema.TableName;
Co7e
1
Se o usuário tiver uma barra invertida, execute o seguinte: ALTER SCHEMA dbo TRANSFER "DOMAIN \ user" .tableName
PatricF
@PatricF O citado identificadores regras se aplicam a nomes de esquema, assim como para qualquer outro nome: [DOMAIN\user].[tableName]. Em geral, na comunidade do SQL Server, os identificadores entre aspas Transact-SQL são usados ​​( [e ]), evite, a "menos que haja um requisito específico para isso.
Remus Rusanu
Como Ele pediu todas as minhas Tabelas , marque esta e esta para fazê-lo em uma única afirmação, a esperança ajuda alguém.
shaijut
2
@leigero use [e ], como qualquer outro caso, quando quiser ser preciso sobre o nome de um objeto SQL. [domain\user123].TableName.
Remus Rusanu
40

Você pode executar o seguinte, o que irá gerar um conjunto de instruções ALTER sCHEMA para todos os seus talbes:

SELECT 'ALTER SCHEMA dbo TRANSFER ' + TABLE_SCHEMA + '.' + TABLE_NAME 
FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'jonathan'

Em seguida, você deve copiar e executar as instruções no analisador de consultas.

Aqui está um script mais antigo que fará isso para você também, acho, alterando o proprietário do objeto. Ainda não tentei em 2008, no entanto.

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

SELECT
  @old = 'jonathan'
  , @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

Peguei neste site .

Ele também fala sobre fazer o mesmo para procedimentos armazenados, se necessário.

patmortech
fonte
Tentei o segundo bit sem sucesso, mas obrigado pelo link, vou dar uma olhada.
Jonathan Hall
Você não conseguiu usar a seleção INFORMATION_SCHEMA acima para gerar todas as suas instruções ALTER SCHEMA automaticamente?
patmortech
Observe a seguinte citação da documentação de INFORMATION_SCHEMA.TABLES : " Importante Não use exibições INFORMATION_SCHEMA para determinar o esquema de um objeto. A única maneira confiável de localizar o esquema de um objeto é consultar a exibição de catálogo sys.objects." Portanto, o exemplo deve ser reescrito para uso sys.tables(um subconjunto de sys.objects).
Heinzi,
21
USE MyDB;
GO
ALTER SCHEMA dbo TRANSFER jonathan.MovieData;
GO

Ref: ALTER SCHEMA

Trigo mitch
fonte
15

Mova a tabela do esquema dbo para MySchema:

 ALTER SCHEMA MySchema TRANSFER dbo.MyTable


Mova a tabela de MySchema para o esquema dbo:

 ALTER SCHEMA dbo TRANSFER MySchema.MyTable
Neru-J
fonte
9

Acabei de postar isso para uma pergunta semelhante: No sql server 2005, como altero o "esquema" de uma tabela sem perder nenhum dado?


Uma ligeira melhoria na excelente resposta do sAeid ...

Eu adicionei um exec para que este código seja executado automaticamente e adicionei uma união na parte superior para que eu pudesse alterar o esquema de ambas as tabelas E procedimentos armazenados:

DECLARE cursore CURSOR FOR 


select specific_schema as 'schema', specific_name AS 'name'
FROM INFORMATION_SCHEMA.routines
WHERE specific_schema <> 'dbo' 

UNION ALL

SELECT TABLE_SCHEMA AS 'schema', TABLE_NAME AS 'name'
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_SCHEMA <> 'dbo' 



DECLARE @schema sysname, 
 @tab sysname, 
 @sql varchar(500) 


OPEN cursore     
FETCH NEXT FROM cursore INTO @schema, @tab 

WHILE @@FETCH_STATUS = 0     
BEGIN 
 SET @sql = 'ALTER SCHEMA dbo TRANSFER [' + @schema + '].[' + @tab +']'    
 PRINT @sql   
 exec (@sql)  
 FETCH NEXT FROM cursore INTO @schema, @tab     
END 

CLOSE cursore     
DEALLOCATE cursore

Eu também tive que restaurar um dbdump e descobri que o esquema não era dbo - passei horas tentando fazer com que o Sql Server management studio ou visual studio transferisse os dados para alterar o esquema de destino ... Acabei apenas executando isso contra o restaurado despeje no novo servidor para fazer as coisas do jeito que eu queria.

Lanceomagnifico
fonte
Funciona muito bem. Obrigado.
bgx
2

Maneira de fazer isso por algo individual:

alterar esquema dbo transfer jonathan.MovieData

Jon Onstott
fonte
2

Eu tive um problema semelhante, mas meu esquema tinha uma barra invertida. Nesse caso, inclua os colchetes ao redor do esquema.

ALTER SCHEMA dbo TRANSFER [DOMAIN\jonathan].MovieData;
Hannover Fist
fonte
2

Abra o SQL Server como conta SA e clique em nova consulta após as consultas abaixo

em seguida, clique em executar para reverter todo o esquema de propriedade de volta para a conta SA

alter authorization on schema::[db_datareader] to [dbo]
alter authorization on schema::[db_datareader] to [db_datareader]
alter authorization on schema::[db_datawriter] to [dbo]
alter authorization on schema::[db_datawriter] to [db_datawriter]
alter authorization on schema::[db_securityadmin] to [dbo]
alter authorization on schema::[db_securityadmin] to [db_securityadmin]
alter authorization on schema::[db_accessadmin] to [dbo]
alter authorization on schema::[db_accessadmin] to [db_accessadmin]
alter authorization on schema::[db_backupoperator] to [dbo]
alter authorization on schema::[db_backupoperator] to [db_backupoperator]
alter authorization on schema::[db_ddladmin] to [dbo]
alter authorization on schema::[db_ddladmin] to [db_ddladmin]
alter authorization on schema::[db_owner] to [dbo]
alter authorization on schema::[db_owner] to [db_owner]
MJ X
fonte
1

ms-help: //MS.SQLCC.v9/MS.SQLSVR.v9.en/tsqlref9/html/0a760138-460e-410a-a3c1-d60af03bf2ed.htm

ALTER SCHEMA schema_name TRANSFER securable_name


fonte