9

SQL Server veritabanı şemalarını geliştirici dostu SQL komut dosyaları olarak nasıl dışa aktarabilirim? geliştirici dostu BySQL Server veritabanı diyagramlarını nasıl yazabilirim?

, ben existing solutions tarafından kullanılan dağınık birçokları UPDATE s tarzı aksine bir insan bunları yazardım şekilde benzer bir şekilde yazılmıştır demek.

(bu sitede o benzer soruları Not yalnızca SQL Server veya diyagramların göç belirli sürümlerini kapsayacak şekilde görünmektedir.)

cevap

15

İşte bunu yapmanın bir senaryo. SQL Server 2008 R2 içinde test edilmiş ve 2012.

DECLARE @values nvarchar(max); 
SET @values = 
(
    SELECT ' 
     (''' + REPLACE(name, '''', '''''') + ''', ' + CAST(principal_id AS VARCHAR(100)) +', ' + CAST(version AS VARCHAR(100)) + ', ' + sys.fn_varbintohexstr(definition) + '),' 
    FROM sysdiagrams 
    FOR XML PATH(''), TYPE 
).value('.', 'nvarchar(max)'); 
SET @values = LEFT(@values, LEN(@values) - 1); 

SELECT 
'IF OBJECT_ID(N''dbo.sysdiagrams'') IS NULL 
    CREATE TABLE dbo.sysdiagrams 
    (
     name sysname NOT NULL, 
     principal_id int NOT NULL, 
     diagram_id int PRIMARY KEY IDENTITY, 
     version int, 

     definition varbinary(max) 
     CONSTRAINT UK_principal_name UNIQUE 
     (
      principal_id, 
      name 
     ) 
    ); 

MERGE sysdiagrams AS Target 
    USING 
    (
     VALUES' + @values + ' 
    ) AS Source (name, principal_id, version, definition) 
    ON Target.name = Source.name 
     AND Target.principal_id = Source.principal_id 
    WHEN MATCHED THEN 
     UPDATE SET version = Source.version, definition = Source.definition 
    WHEN NOT MATCHED BY Target THEN 
     INSERT (name, principal_id, version, definition) 
     VALUES (name, principal_id, version, definition); 
'; 

Temelde sysdiagrams tablonun içeriğini ihraç ediyor. Diyagramların kimlik numaralarını korumadığını unutmayın. Ayrıca, diyagramları kimin oluşturduğunu da korur, ancak hedef veritabanında kimlik numarası da bulunmalıdır.

Ortaya çıkan komut dosyasını, veritabanı şeması nesnesi olmayan bir sunucu örneğinde çalıştırırsanız, yine de çalışmalıdır. Ancak, bunu yaptıktan sonra, SSMS'de görünmeleri için, Veritabanı Diyagramları düğümünü genişletmeniz gerektiğini ve bunları oluşturmaları istendiğinde Evet'u tıklamanız gerektiğini düşünüyorum.

Bu, 2008123 betiğine göre here numaralı telefonu kullanmaktadır.

Yakalama olduğunu unutmayın! SSMS ve diğer Microsoft araçları, birkaç diyagramdan daha fazlasına sahipseniz, sonuç kümesindeki sonuç metnini keser. veritabanı, örnek adı ve SQL tutucuları içinde

$ErrorActionPreference = "Stop" 

function Pause([string]$message) { 
    Write-Host $message 
    $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown") | Out-Null 
} 

function Set-Clipboard { 
    $input | PowerShell -NoProfile -STA -Command { 
     Add-Type -AssemblyName "System.Windows.Forms" 
     [Windows.Forms.Clipboard]::SetText($input) 
    } 
} 

$connection = New-Object System.Data.SqlClient.SqlConnection ("Data Source=DATABASE_INSTANCE;Initial Catalog=DATABASE;Integrated Security=SSPI") 
$connection.Open() 
$command = $connection.CreateCommand() 
$command.CommandText = @" 
--SQL CODE 
"@ 

$command.CommandTimeout = 60 
$result = $command.ExecuteScalar() 
$command.Dispose() 
$connection.Dispose() 

Pause "Press any key to copy the resulting SQL to the clipboard..." 
$result | Set-Clipboard 

Dolgu: Tam metni almak için buraya sorgu çalıştırmak ve panoya çıkışını koymak için bir PowerShell senaryo.