Вероятно, ваш код все еще будет ссылаться на эти объекты как dbo.object
- нет простого способа исправить это, кроме грубой силы. Вы, вероятно, можете найти все вхождения dbo.
довольно легко, но они также могут возвращать ложные срабатывания, такие как EXEC dbo.sp_executesql
, dbo.
в комментариях, истинные ссылки на объекты, которые остаются в dbo.
схеме, и т. Д.
Ваши зависимости, вероятно, будут совершенно не в порядке, но я не проверил это полностью. Я знаю, что в этом сценарии:
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;
Внешние ключи на самом деле переносятся более плавно, чем я ожидал (с оговоркой, которую я тестирую на гораздо более свежей версии, чем вы). Но поскольку код по- blat.pX
прежнему ссылается dbo.bar
, очевидно, выполняется процедура:
EXEC blat.pX;
Собирается дать эту ошибку:
Сообщение 208, уровень 16, состояние 1, процедура pX
Неверное имя объекта 'dbo.bar'.
И запросы на зависимость, такие как:
SELECT * FROM sys.dm_sql_referenced_entities('blat.pX', N'OBJECT');
Выдаст эту ошибку:
Сообщение 2020, уровень 16, состояние 1
Зависимости, сообщаемые для объекта "blat.pX", могут не включать ссылки на все столбцы. Это либо потому, что объект ссылается на объект, который не существует, либо из-за ошибки в одном или нескольких утверждениях в объекте. Перед повторным запуском запроса убедитесь, что в объекте нет ошибок и все объекты, на которые ссылается объект, существуют.
И запрашивая мнение:
SELECT a, barA FROM blat.vFooBar;
Выдает эти ошибки:
Сообщение 208, Уровень 16, Состояние 1, Процедура vFooBar Неверное
имя объекта 'dbo.foo'.
Сообщение 4413, уровень 16, состояние 1
Не удалось использовать представление или функцию blat.vFoobar из-за ошибок привязки.
Таким образом, это может повлечь за собой много очистки. И после того, как вы исправите все ссылки на объекты, вы, вероятно, захотите перекомпилировать все модули и обновить все представления в новой схеме. Вы можете сгенерировать скрипт для этого, очень похожий на пример выше.