Provavelmente, seu código ainda fará referência a esses objetos como dbo.object
- não há maneira fácil de corrigir isso, exceto a força bruta. Provavelmente, você pode encontrar todas as ocorrências com dbo.
bastante facilidade, mas elas também podem retornar falsos positivos, como EXEC dbo.sp_executesql
,dbo.
nos comentários, verdadeiras referências a objetos que permanecem no dbo.
esquema, etc.
Suas dependências provavelmente estarão completamente fora de sintonia, mas ainda não testei isso completamente. Eu sei que neste cenário:
CREATE SCHEMA blat AUTHORIZATION dbo;
GO
CREATE TABLE dbo.foo(a INT PRIMARY KEY);
CREATE TABLE dbo.bar(a INT FOREIGN KEY REFERENCES dbo.foo(a));
GO
CREATE PROCEDURE dbo.pX AS
BEGIN
SET NOCOUNT ON;
SELECT a FROM dbo.bar;
END
GO
CREATE VIEW dbo.vFooBar
AS
SELECT foo.a, bar.a AS barA
FROM dbo.foo
INNER JOIN dbo.bar
ON foo.a = bar.a;
GO
ALTER SCHEMA blat TRANSFER dbo.foo;
ALTER SCHEMA blat TRANSFER dbo.bar;
ALTER SCHEMA blat TRANSFER dbo.pX;
ALTER SCHEMA blat TRANSFER dbo.vFooBar;
As chaves estrangeiras realmente migram mais suavemente do que eu esperava (com a ressalva de que estou testando em uma versão muito mais recente que você). Mas porque o código blat.pX
ainda faz referênciadbo.bar
, obviamente executando o procedimento:
EXEC blat.pX;
Vai gerar este erro:
Msg 208, nível 16, estado 1, procedimento pX
Nome de objeto inválido 'dbo.bar'.
E consultas de dependência, como:
SELECT * FROM sys.dm_sql_referenced_entities('blat.pX', N'OBJECT');
Irá gerar este erro:
Msg 2020, Nível 16, Estado 1
As dependências relatadas para a entidade "blat.pX" podem não incluir referências a todas as colunas. Isso ocorre porque a entidade faz referência a um objeto que não existe ou devido a um erro em uma ou mais instruções na entidade. Antes de executar novamente a consulta, verifique se não há erros na entidade e se todos os objetos referenciados pela entidade.
E consultando a visualização:
SELECT a, barA FROM blat.vFooBar;
Rende estes erros:
Msg 208, Nível 16, Estado 1, Procedimento vFooBar
Nome de objeto inválido 'dbo.foo'.
Msg 4413, Nível 16, Estado 1
Não foi possível usar a exibição ou a função 'blat.vFoobar' devido a erros de ligação.
Portanto, isso pode envolver muita limpeza. E depois de corrigir todas as referências a objetos, você provavelmente desejará recompilar todos os módulos e atualizar todas as visualizações no novo esquema. Você pode gerar um script parecido com o exemplo acima.