Как экспортировать диаграмму базы данных SQL Server 2008 в другую БД? - PullRequest
30 голосов
/ 26 октября 2010

Я использую удобный инструмент создания диаграмм базы данных в SQL Server 2008 для создания и управления отношениями.Я экспортировал исходную базу данных в целевую базу данных, но диаграмма не встречается.

Я смотрю по сторонам, пытаясь выяснить, как экспортировать только мою диаграмму из одной базы данных в другую ...* онлайновая статья в КБ не выполняется, поскольку select * from dtproperties больше не существует.

Ответы [ 6 ]

45 голосов
/ 26 ноября 2010

@ Эш У меня была такая же проблема.Вот что мы сделали, чтобы обойти это ...

Кажется, что системные диаграммы хранятся в таблице "sysdiagrams".Итак, первое, что вам нужно сделать, это определить Diagram_id диаграммы, которую вы хотите скопировать.Запустите следующий запрос, чтобы перечислить их все.** Обратите внимание, что вам нужно заменить «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

Затем вам нужно вручную установить "Principal_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

11 голосов
/ 20 февраля 2014

Это генерирует строку импорта :

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)) + ',' +
        ' @definition=@def'
    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)) + ',' +
        ' @definition=@def'
    AS ExportQuery
FROM
    [dbo].[sysdiagrams]
WHERE
    [name] = @name
7 голосов
/ 23 февраля 2012

Вы можете избавиться от оператора UPDATE, исправив оператор INSERT - в частности, выбранную часть. Вы вставляете столбец diagram_id в столбец principal_id (схема_идентификации является идентификатором).

Измените его на:

DECLARE @SourceDiagramId int = 1
INSERT INTO [DestinationDB].[dbo].sysdiagrams
SELECT [name],principal_id,version,definition from [SourceDB].[dbo].sysdiagrams
WHERE diagram_id = @SourceDiagramId

И до того, это все в первый раз.

5 голосов
/ 27 ноября 2014

Как и в ответе C Isaze , есть три простых шага:

1- Создайте такое же количество «фиктивных» диаграмм на целевом сервере, на который вы хотите скопировать диаграммы

2 - добавить целевой сервер в качестве связанного сервера на исходном сервере

enter image description here enter image description here enter image description here

3 - запустить этот скрипт на исходном сервере

update [LINKEDSERVER].TARGETDB.[dbo].sysdiagrams set [definition]=
    (SELECT [definition] from SOURCEDB.[dbo].sysdiagrams WHERE diagram_id = 1)
    where diagram_id=1 
4 голосов
/ 11 апреля 2013

Если базы данных находятся на разных серверах, могут возникнуть проблемы с разрешениями.

Чтобы скопировать системные диаграммы, создайте такое же количество «фиктивных» диаграмм на целевом сервере, на который вы хотите копировать диаграммы, добавьтецелевой сервер в качестве связанного сервера на исходном сервере, а затем запустите сценарий:

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
1 голос
/ 23 ноября 2015

Существует инструмент для экспорта диаграмм в файл и обратно в базу данных, который вы можете найти здесь: https://github.com/timabell/database-diagram-scm/

Вы можете использовать это, указав его в исходную базу данных и выполниэкспортировать, а затем указать на целевую базу данных и выполнить импорт.

...