Сравнение схем
Сравнение схем
Здравствуйте.
У меня есть таблица для которой созданы несколько представлений, включая индексированное представление (WITH SCHEMABINDING). При этом представления к этой таблице ссылаются сами на себя, а точнее на это индексированное представление.
Примерно так:
index_view = select from table
view = select from table join index_view
Так вот при изменении таблицы инструмент сравнения создает скрипт при котором он сначала удаляет все зависимые представления, потом обновляет таблицу, а потом актуализирует все представления (sp_refreshview) и уже в конце создает недостающие представления.
В следствии чего у меня падает скрипт обновления на стадии sp_refreshview, т.к. не все представления в данный момент существуют.
Было бы хорошо, если бы сначала создавались все удаленные объекты, а уже потом проходить sp_refreshview по остальным.
У меня есть таблица для которой созданы несколько представлений, включая индексированное представление (WITH SCHEMABINDING). При этом представления к этой таблице ссылаются сами на себя, а точнее на это индексированное представление.
Примерно так:
index_view = select from table
view = select from table join index_view
Так вот при изменении таблицы инструмент сравнения создает скрипт при котором он сначала удаляет все зависимые представления, потом обновляет таблицу, а потом актуализирует все представления (sp_refreshview) и уже в конце создает недостающие представления.
В следствии чего у меня падает скрипт обновления на стадии sp_refreshview, т.к. не все представления в данный момент существуют.
Было бы хорошо, если бы сначала создавались все удаленные объекты, а уже потом проходить sp_refreshview по остальным.
Re: Сравнение схем
Мы исследуем данную проблему и сообщим Вам о результате.
Re: Сравнение схем
Приносим извинения за задержку с ответом.
Не могли бы Вы прислать нам скрипт для воспроизведения данной проблемы?
Вы можете прислать ответ напрямую в нашу службу поддержки на alexaATdevartDOTcom и supportATdevartDOTcom.
Не могли бы Вы прислать нам скрипт для воспроизведения данной проблемы?
Вы можете прислать ответ напрямую в нашу службу поддержки на alexaATdevartDOTcom и supportATdevartDOTcom.
Re: Сравнение схем
Создаем такой набор объектов в двух БД
далее на одной из бд выполняем
в результате сравнения получаем скрипт
Я чуть сократил, но суть понятна.
У вас обработка представлений идет по алфавиту, а надо что бы сначала создавались удаленные, а уже потом рефреш.
Код: Выделить всё
CREATE TABLE dbo.test (
id INT NOT NULL,
link VARCHAR(50) NULL,
CONSTRAINT PK_test_id PRIMARY KEY CLUSTERED (id)
) ON [PRIMARY]
GO
CREATE VIEW dbo.v_test
WITH SCHEMABINDING
AS SELECT t.link, count_big(*) AS cnt
FROM dbo.test AS t
GROUP BY t.link
GO
CREATE UNIQUE CLUSTERED INDEX ix_v_test
ON dbo.v_test (link)
ON [PRIMARY]
GO
CREATE VIEW dbo.v_big_test
AS SELECT t.id
FROM dbo.test AS t
INNER JOIN v_test AS v
ON t.link = v.link
WHERE v.cnt > 100
GO
CREATE VIEW dbo.v_test_big
AS SELECT t.id
FROM dbo.test AS t
INNER JOIN v_test AS v
ON t.link = v.link
WHERE v.cnt > 100
GO
Код: Выделить всё
ALTER TABLE dbo.test
ADD value INT NULL
GO
Код: Выделить всё
--
-- Удалить представление [dbo].[v_test]
--
DROP VIEW IF EXISTS [dbo].[v_test]
GO
IF @@ERROR<>0 OR @@TRANCOUNT=0 BEGIN IF @@TRANCOUNT>0 ROLLBACK SET NOEXEC ON END
GO
--
-- Создать столбец [value] для таблицы [dbo].[test]
--
ALTER TABLE [dbo].[test]
ADD [value] [int] NULL
GO
IF @@ERROR<>0 OR @@TRANCOUNT=0 BEGIN IF @@TRANCOUNT>0 ROLLBACK SET NOEXEC ON END
GO
--
-- Обновить представление [dbo].[v_big_test]
--
EXEC sp_refreshview '[dbo].[v_big_test]'
GO
IF @@ERROR<>0 OR @@TRANCOUNT=0 BEGIN IF @@TRANCOUNT>0 ROLLBACK SET NOEXEC ON END
GO
--
-- Создать представление [dbo].[v_test]
--
GO
CREATE VIEW [dbo].[v_test]
WITH SCHEMABINDING
AS SELECT t.link, count_big(*) AS cnt
FROM dbo.test AS t
GROUP BY t.link
GO
IF @@ERROR<>0 OR @@TRANCOUNT=0 BEGIN IF @@TRANCOUNT>0 ROLLBACK SET NOEXEC ON END
GO
--
-- Создать индекс [ix_v_test] для объекта типа представление [dbo].[v_test]
--
CREATE UNIQUE CLUSTERED INDEX [ix_v_test]
ON [dbo].[v_test] ([link])
ON [PRIMARY]
GO
IF @@ERROR<>0 OR @@TRANCOUNT=0 BEGIN IF @@TRANCOUNT>0 ROLLBACK SET NOEXEC ON END
GO
--
-- Обновить представление [dbo].[v_test_big]
--
EXEC sp_refreshview '[dbo].[v_test_big]'
GO
IF @@ERROR<>0 OR @@TRANCOUNT=0 BEGIN IF @@TRANCOUNT>0 ROLLBACK SET NOEXEC ON END
GO
У вас обработка представлений идет по алфавиту, а надо что бы сначала создавались удаленные, а уже потом рефреш.
Re: Сравнение схем
Мы исправим данную проблему в одной из следующих версий.
Re: Сравнение схем
Хотим сообщить Вам, что данная проблема устранена в новой версии 5.5 https://www.devart.com/ru/dbforge/sql/s ... nload.html
Благодарим Вас за Вашу помощь в усовершенствовании dbForge Studio for SQL Server.
Благодарим Вас за Вашу помощь в усовершенствовании dbForge Studio for SQL Server.