2013-10-31 46 views
2

我使用SQL Server 2012和SQL Server 2008 R2。如何从SQL Server中的图创建备份脚本?

我从我的数据库中的所有对象(表/触发器/存储过程/函数...)创建一个脚本。

我从SQL Server Management Studio生成了这个脚本。我可以在另一台服务器上使用此脚本重新创建数据库。但运行我的脚本创建另一个数据库后,我错过了数据库的所有图表。

因此,我需要从数据库中存在的所有图表创建备份脚本。

我需要在目标数据库上执行此脚本以重新创建所有图表。

我发现这个Link。但我需要一些认为自动创建所有脚本(插入命令)。

+0

看看这里它的非常详细的描述你正在尝试做什么http://gursethi.blogspot.co.uk/2011/03/how-to-take-backup-of-database-diagrams .html –

+0

你能澄清一下**你正在尝试备份什么?你说“我想从我的图表创建备份脚本”是否要在图表中保存_diagram_或_objects_? – Tony

+0

你的链接不工作:404 - 找不到 –

回答

2

脚本化数据库不包含图表,因为它们不是服务器对象与表或存储过程相同;它们作为sysdiagrams表中的数据存在。

上SO类似的问题问How do you migrate SQL Server Database Diagrams to another Database?

接受的答案是对sysdiagrams表的内容复制到新的数据库,所以你可以在您的脚本的表的内容。 answer with the most up-votes有链接到scripting diagrams的方式。

我试过备份,然后将数据库还原到同一服务器,删除我创造了图(我只用了一个),然后运行下面的查询:

INSERT INTO database2.dbo.sysdiagrams 
     ( 
     NAME 
     ,principal_id 
     ,version 
     ,DEFINITION 
     ) 
     SELECT NAME 
       ,principal_id 
       ,version 
       ,DEFINITION 
     FROM database1.dbo.sysdiagrams 

下图是成功还原,但是我在恢复的备份上这样做了,我应该使用从脚本生成的新数据库来测试它。

UPDATE:

我脚本一个数据库,然后从它创建一个新的数据库。当尝试使用INSERT语句来重建图我得到了错误

enter image description here

所以,虽然看起来可能是不平凡的,从脚本创建一个新的数据库,以创建图表。请参考脚本图表的答案,并根据自己的需要进行修改。

也许你可以进一步调查并发布自己的答案:)

+1

+1:在运行之前将脚本/数据库图表脚本化到脚本/文本文件似乎碰到某种文件限制,并给出“docfile已损坏”。直接拷贝它,使用像你的交叉数据库'插入'似乎100%的时间工作。当我得到时间时,我会看看它是否只是线长限制。 –

8

我已经找到一个合理的解决方案。问题是Management Studio无法为非XML数据显示更多65535个字符,并且无法将其设置为显示超过65535个字符。

见用于文档代码:)

备份脚本:

-- 1. Read from DB, using XML to workaround the 65535 character limit 
declare @definition varbinary(max) 
select @definition = definition from dbo.sysdiagrams where name = 'ReportingDBDiagram' 

select 
    '0x' + cast('' as xml).value('xs:hexBinary(sql:variable("@definition"))', 'varchar(max)') 
for xml path('') 

-- 2. Open the result XML in Management Studio 
-- 3. Copy the result 
-- 4. Paste this in backup script for @definition variable 

恢复脚本:

declare @definition varbinary(max) 
set @definition = 0xD0CF -- Paste 0x0 value from Backup script 

-- Create diagram using 'official' Stored Procedure 
exec dbo.sp_creatediagram 
    @diagramname = 'ReportingDBDiagramCopy', 
    @owner_id = null, 
    @version = 1, 
    @definition = @definition 
+0

即使使用Azure SQL,仍然非常有帮助。谢谢! –

0

这里有一个快速&肮脏的方法我用。由于查询窗口将不显示完整的varbinary(最大)的定义字段的值,而将XML编辑器,我输出的行XML如下:

  1. 在服务器上运行下面的查询/包含图表数据库:

    SELECT 'INSERT sysdiagrams(name,principal_id,diagram_id,version,definition) VALUES('''+name+''',' 
    +CONVERT(varchar(2),principal_id)+','+CONVERT(varchar(2),diagram_id)+','+CONVERT(varchar(2),version)+',' 
    +'0x' + CAST('' as xml).value('xs:hexBinary(sql:column("definition"))','varchar(max)') +')' 
    FROM RCSQL_ClaimStatus.dbo.sysdiagrams 
    FOR XML PATH 
    
  2. 单击生成的链接,打开XML结果,并CTRL-A & CTRL-C复制生成的所有行。

  3. 将输出粘贴回查询窗口。我通常粘贴一对IDENTITY_INSERT的像这样间:

    --TRUNCATE TABLE sysdiagrams 
    SET IDENTITY_INSERT sysdiagrams ON; 
    <row>INSERT sysdiagrams(name,principal_id,diagram_id,version,definition) VALUES('ERD1',1,1,1,0xD0CF11E0A1B11AE100000...)</row> 
    <row>INSERT sysdiagrams(name,principal_id,diagram_id,version,definition) VALUES('ERD2',1,2,1,0xD0CF11E0A1B11AE100000...)</row> 
    <row>INSERT sysdiagrams(name,principal_id,diagram_id,version,definition) VALUES('ERD3',1,3,1,0xD0CF11E0A1B11AE100000...)</row> 
    SET IDENTITY_INSERT sysdiagrams OFF; 
    
  4. 从插入删除行& /行XML标记,并在目标服务器上运行它们。如果要用新值替换所有值,可以截断sysdiagrams表。