Eu costumava DBCC CLONEDATABASE
criar uma cópia de um banco de dados sem nenhum dado. Descobri agora que alguns esquemas não foram criados, portanto, alguns objetos não têm esquema. É difícil reproduzir isso, pois é específico do banco de dados, ou seja, eu clonei 9 com sucesso, mas 1 com esse problema. Todos os esquemas seriam de propriedade do dbo.
Como não consigo reproduzir isso, por que certos esquemas não foram criados no clone, alguém teria alguma ideia do que verificar ou se existe uma maneira de depurar o comando dbcc?
Estou usando o SQL Server 2016 SP2 CU1.
O banco de dados foi criado originalmente antes do SQL Server 2005. Se eu for select name, schema_id, schema_name(schema_id) SchemaName, * From sys.objects
em certos objetos, o schema name
é null
e o schema id
não está no sys.schemas
. Algumas tabelas e sinônimos são afetados, e não consigo girar o nó de tabelas ou o nó de sinônimos no explorador de objetos de ssms (erro de sessão eliminado!). Também para esclarecer isso é apenas um problema no banco de dados clonado. Eu também tentei recriar o sinônimo e transferir a propriedade da tabela, mas recebo um erro dizendo que a tabela não pode ser encontrada.
Parece que você tinha objetos no SQL Server 2000 e seu proprietário foi descartado, deixando esses objetos "órfãos". Quando o banco de dados foi atualizado para qualquer versão >= 2005, o "proprietário" foi alterado para um
schema_id
, mas para os proprietários que foram descartados, esse esquema não existia.Para corrigir isso, você pode criar vários esquemas fictícios até ter um que se correlaciona com cada ausente
schema_id
e, em seguida, executar uma instrução como esta para cada objeto em cada esquema ausente:A única complicação pode ser se você tiver objetos com o mesmo nome, mas
schema_id
valores diferentes; estes irão colidir. Depois de resolver tudo, você pode descartar todos os esquemas fictícios.Em algum momento, você pode considerar criar um novo banco de dados vazio em uma versão moderna, copiando suas tabelas e dados para ele e, em seguida, se livrar do antigo. Pode eliminar mais surpresas como esta no futuro.