Сравнение схем

Обсуждение возникших проблем, предложений и ошибок dbForge for SQL Server
Ответить
deas
Сообщения: 174
Зарегистрирован: Чт 21 ноя 2013 10:54

Сравнение схем

Сообщение deas » Ср 03 май 2017 15:37

Здравствуйте.

У меня есть таблица для которой созданы несколько представлений, включая индексированное представление (WITH SCHEMABINDING). При этом представления к этой таблице ссылаются сами на себя, а точнее на это индексированное представление.
Примерно так:
index_view = select from table
view = select from table join index_view

Так вот при изменении таблицы инструмент сравнения создает скрипт при котором он сначала удаляет все зависимые представления, потом обновляет таблицу, а потом актуализирует все представления (sp_refreshview) и уже в конце создает недостающие представления.

В следствии чего у меня падает скрипт обновления на стадии sp_refreshview, т.к. не все представления в данный момент существуют.

Было бы хорошо, если бы сначала создавались все удаленные объекты, а уже потом проходить sp_refreshview по остальным.

Alexander
Devart Team
Сообщения: 1246
Зарегистрирован: Ср 02 ноя 2011 11:32

Re: Сравнение схем

Сообщение Alexander » Пт 05 май 2017 13:41

Мы исследуем данную проблему и сообщим Вам о результате.

Alexander
Devart Team
Сообщения: 1246
Зарегистрирован: Ср 02 ноя 2011 11:32

Re: Сравнение схем

Сообщение Alexander » Ср 24 май 2017 14:56

Приносим извинения за задержку с ответом.

Не могли бы Вы прислать нам скрипт для воспроизведения данной проблемы?

Вы можете прислать ответ напрямую в нашу службу поддержки на alexaATdevartDOTcom и supportATdevartDOTcom.

deas
Сообщения: 174
Зарегистрирован: Чт 21 ноя 2013 10:54

Re: Сравнение схем

Сообщение deas » Пт 26 май 2017 14:36

Создаем такой набор объектов в двух БД

Код: Выделить всё

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
Я чуть сократил, но суть понятна.
У вас обработка представлений идет по алфавиту, а надо что бы сначала создавались удаленные, а уже потом рефреш.

Alexander
Devart Team
Сообщения: 1246
Зарегистрирован: Ср 02 ноя 2011 11:32

Re: Сравнение схем

Сообщение Alexander » Пт 26 май 2017 15:29

Спасибо за ответ. Мы исследуем данную проблему.

Alexander
Devart Team
Сообщения: 1246
Зарегистрирован: Ср 02 ноя 2011 11:32

Re: Сравнение схем

Сообщение Alexander » Вт 30 май 2017 11:34

Мы исправим данную проблему в одной из следующих версий.

Alexander
Devart Team
Сообщения: 1246
Зарегистрирован: Ср 02 ноя 2011 11:32

Re: Сравнение схем

Сообщение Alexander » Пт 04 авг 2017 14:45

Хотим сообщить Вам, что данная проблема устранена в новой версии 5.5 https://www.devart.com/ru/dbforge/sql/s ... nload.html

Благодарим Вас за Вашу помощь в усовершенствовании dbForge Studio for SQL Server.

Ответить