Как экспортировать диаграмму базы данных SQL Server 2008 в другую БД?
Я использую удобный инструмент Diagramming базы данных в SQL Server 2008 для создания и управления отношениями. Я экспортировал sourceDB в destinationDB, но диаграмма не встречается.
Я смотрю вокруг, пытаясь выяснить, как экспортировать только диаграмму, которую я имею в одной базе данных, другой... Эта статья в Интернете в Интернете терпит неудачу, поскольку select * from dtproperties
больше не существует.
Ответы
Ответ 1
@Ash У меня была такая же проблема. Вот что мы сделали, чтобы обойти это...
Кажется, что системные диаграммы хранятся в таблице "sysdiagrams". Итак, первое, что вам нужно сделать, это определить диаграмму диаграммы, которую вы хотите скопировать. Выполните следующий запрос, чтобы перечислить их все. ** Обратите внимание, что вам нужно заменить "SourceDB" на имя вашей базы данных.
-- List all database diagrams
SELECT * FROM [SourceDB].[dbo].sysdiagrams
Затем вы можете использовать INSERT для дублирования диаграммы из одной базы данных в другую следующим образом. ** Примечание снова замените "SourceDB" на имя базы данных, содержащей существующую диаграмму, и "DestinationDB" с именем базы данных, которую вы хотите скопировать. Также @SourceDiagramId должен быть установлен на идентификатор, полученный выше.
-- Insert a particular database diagram
DECLARE @SourceDiagramId int = 1
INSERT INTO [DestinationDB].[dbo].sysdiagrams
SELECT [name],diagram_id , version,definition from [SourceDB].[dbo].sysdiagrams
WHERE diagram_id = @SourceDiagramId
Затем вам нужно вручную установить "main_id" на 1.
-- Update the principal id (no idea why, but it set the owner as some asp_net user
UPDATE [DestinationDB].[dbo].sysdiagrams
SET principal_id = 1
Это сработало для нас, кажется, довольно хаки, особенно потому, что диаграмма полностью хранится в одном "определении" двоичного поля.
Ответ приходит от:
http://www.dotnetspider.com/resources/21180-Copy-or-move-database-digram-from-for.aspx
Ответ 2
Это создает строку импорта:
SELECT
'DECLARE @def AS VARBINARY(MAX) ; ' +
'SELECT @def = CONVERT(VARBINARY(MAX), 0x' + CONVERT(NVARCHAR(MAX), [definition], 2) + ', 2) ;' +
' EXEC dbo.sp_creatediagram' +
' @diagramname=''' + [name] + ''',' +
' @version=' + CAST([version] AS NVARCHAR(MAX)) + ',' +
' @[email protected]'
AS ExportQuery
FROM
[dbo].[sysdiagrams]
WHERE
[name] = '' -- Diagram Name
Затем вы запускаете сгенерированную строку в другой БД.
КАК ПРОЦЕДУРА:
-- =============================================
-- Author: Eduardo Cuomo
-- Description: Export Database Diagrama to SQL Query
-- =============================================
CREATE PROCEDURE [dbo].[Sys_ExportDatabaseDiagram]
@name SYSNAME -- Diagram Name
AS
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
SELECT
'DECLARE @def AS VARBINARY(MAX) ; ' +
'SELECT @def = CONVERT(VARBINARY(MAX), 0x' + CONVERT(NVARCHAR(MAX), [definition], 2) + ', 2) ; ' +
' EXEC dbo.sp_creatediagram' +
' @diagramname=''''' + [name] + ''''',' +
' @version=' + CAST([version] AS NVARCHAR(MAX)) + ',' +
' @[email protected]'
AS ExportQuery
FROM
[dbo].[sysdiagrams]
WHERE
[name] = @name
Ответ 3
Вы можете избавиться от инструкции UPDATE
, исправив инструкцию INSERT
- в частности, часть выбора. Вы вставляете столбец diagram_id
в столбец principal_id
(diagram_id - это идентификатор).
Измените его на:
DECLARE @SourceDiagramId int = 1
INSERT INTO [DestinationDB].[dbo].sysdiagrams
SELECT [name],principal_id,version,definition from [SourceDB].[dbo].sysdiagrams
WHERE diagram_id = @SourceDiagramId
И престо, все в нем в первый раз.
Ответ 4
Как и в C Isaze, есть три простых шага:
1- Создайте одинаковое количество диаграмм "dummy" на целевом сервере, где вы хотите скопировать диаграммы
2- Добавить целевой сервер в качестве связанного сервера на исходном сервере
![enter image description here]()
![enter image description here]()
![enter image description here]()
3- запустите этот script на исходном сервере
update [LINKEDSERVER].TARGETDB.[dbo].sysdiagrams set [definition]=
(SELECT [definition] from SOURCEDB.[dbo].sysdiagrams WHERE diagram_id = 1)
where diagram_id=1
Ответ 5
Если базы данных находятся на разных серверах, могут возникнуть проблемы с правами.
Чтобы скопировать sysdiagrams, создайте то же количество диаграмм "dummy" на целевом сервере, на котором вы хотите скопировать диаграммы, добавьте целевой сервер в качестве связанного сервера на исходном сервере, а затем запустите script:
SELECT * from [LINKEDSERVER].TARGETDB.[dbo].sysdiagrams
SELECT * from SOURCEDB.[dbo].sysdiagrams
update [LINKEDSERVER].TARGETDB.[dbo].sysdiagrams set definition=
(SELECT definition from SOURCEDB.[dbo].sysdiagrams WHERE diagram_id = 1)
where diagram_id=1
-- the first 2 select commands will confirm that you are able to connect to both databases
-- then change the id as required to copy all the diagrams
Ответ 6
Здесь есть инструмент для экспорта диаграмм в файл и обратно в базу данных, которую вы можете найти здесь: https://github.com/timabell/database-diagram-scm/
Вы сможете использовать это, указав его в своей исходной базе данных и сделав экспорт, а затем указывая на свою целевую базу данных и сделав импорт.