2010-12-28 4 views
7

Ich möchte die Details aller Indizes, Schlüssel und Fremdschlüssel aus einer Datenbank in SQL Server (2008) abrufen. Wie mache ich das?Wie Skript Indexe, Schlüssel, Fremdschlüssel in SQL Server

Ich plane, dies zu verwenden, um diese Eigenschaften über einige ähnliche Datenbanken zu synchronisieren.

Ich kann SQL Server Management Studio verwenden, aber ich kann keine vollständige Sicherung einer Datenbank aufgrund von Einschränkungen durch den Webhoster vornehmen.

-

Secondary Frage, die Sie brauchen nicht zu beantworten:

Warum etwas ähnliches wie das Datenbankschema in Mysql sein nicht da kann, die alle der Datenbankstruktur in Text SQL-Skript einfach auflistet Format?

+0

Ich möchte dies von einem Skript aus tun. In Mysql würde ich "show create table exampletablename" für jede Tabelle machen. – tomsv

Antwort

6

Angenommen, Sie atleast SQL Server 2005 oder höher verwenden, können Sie die Database Publishing Wizard Skript verwenden Ihr Schema

Diese verwendet werden können Skripte für Schema zu erzeugen, nur, Daten oder beides.

Es integriert sich direkt in Visual Studio 2005 und/oder Visual Web Developer 2005

Wenn Sie VS2008 verwenden, v1.2 Version von SQL-Publishing-Assistent ist bereits vorinstalliert. Sie können überprüfen, here wo es von aufrufen.

+0

+1, das ist wirklich cool. –

+0

Ich erhalte eine Fehlermeldung aus, als ich versuche, das Schema zu veröffentlichen: Status der Datenbankveröffentlichung - Liste der Objekte für Skripterstellung Wird Zusammengestellt (Erfolg) sterben - Skripterstellung für Objekte (Fehler) Meldungen Betrieb nicht gültig ist aufgrund der aktuelle Zustand des Objekts. (SqlPubWiz) - Skript wird auf den Datenträgern geschrieben (Beendet) (Sorry für die deutschen Fehlermeldungen) – tomsv

+0

laufen Sie es von der Kommandozeile oder durch VS? – InSane

1

Als Alternative zu InSanes perfekter Antwort können Sie mit der rechten Maustaste auf ein beliebiges Objekt in SSMS klicken, um es in eine Textdatei oder ein Fenster zu schreiben.
Ein paar kostenlose und nicht-kostenlose Produkte können Sie auch, einschließlich WinSQL.

2

Wenn Sie Skript von T-SQL bekommen müssen dann nur xp_cmdshell verwenden. Zum Beispiel concreate Index concreate Ansicht mit SMO und Powershell-Scripting (Ergebnis in @script Variable ist, können Sie es mit Sp_executesql ausführen kann):

DECLARE @OUTPUT TABLE (line nvarchar(max)) 
DECLARE @cmd VARCHAR(8000), @ps VARCHAR(8000), @psLoadAssemblies VARCHAR(8000), @script nvarchar(max) ='' 
DECLARE @srv nvarchar(max)='<server name>', 
     @ln nvarchar(max)='<login>', 
     @pw nvarchar(max)='<password>', 
     @db nvarchar(max) = '<database>', 
     @schemaName nvarchar(max) = '<schema>', -- without '[' ']' 
     @viewName nvarchar(max) = '<view name>', -- without '[' ']' 
     @indexName nvarchar(max) = '<index name>' -- without '[' ']' 

SET @psLoadAssemblies = '[System.Reflection.Assembly]::LoadWithPartialName(''Microsoft.SqlServer.SMO'')|Out-Null;' 
SET @ps='$using=''Microsoft.SqlServer.Management.Smo'';$s=new-object($using+''.Server'') $srv;$c = $s.ConnectionContext;$c.LoginSecure=$false;$c.Login=$ln;$c.Password=$pw; Write-Host ($s.Databases[$db].Views.Item($viewName,$schemaName).Indexes[$indexName].Script())' 
SET @ps=REPLACE(@ps,'$srv',''''[email protected]+'''') 
SET @ps=REPLACE(@ps,'$ln',''''[email protected]+'''') 
SET @ps=REPLACE(@ps,'$pw',''''[email protected]+'''') 
SET @ps=REPLACE(@ps,'$db',''''[email protected]+'''') 

SET @ps=REPLACE(@ps,'$schemaName',''''[email protected]+'''') 
SET @ps=REPLACE(@ps,'$viewName',''''[email protected]+'''') 
SET @ps=REPLACE(@ps,'$indexName',''''[email protected]+'''') 

SET @cmd = 'powershell -Command "'[email protected][email protected]+'"' 
exec dev.Msg @cmd 
INSERT INTO @OUTPUT 
exec xp_cmdshell @cmd 

SELECT @script+line FROM @OUTPUT 
WHERE line is not null 

PRINT @script 

P. S. Für diejenigen, die fragt, warum wir solche Tricks brauchen könnten: in einigen Szenarien, z.B. "Importieren von Daten unter Verwendung eines Tools von Drittanbietern", funktioniert der Ansatz "Drop-Re-Create" besser als "Enable-Disable" -Objekte, z. weil solch ein Tool von Drittanbietern "truncate" aufrufen kann und wenn Ihre Tabelle an der schemagebundenen Ansicht teilnimmt, erhalten Sie einen Toolfehler eines Drittanbieters (die an indizierten Sichten teilnehmende Tabelle verursacht einen Fehler, weshalb wir gezwungen sind, die Ansicht mit allen Indizes zu löschen) vor dem Import und neu erstellen es nach).

0

Ich habe den Kommentar oder die Antwort des Benutzers "dontomoso" gesehen. Nach der Übersetzung in Englisch scheint es, dass die Operation wegen des aktuellen Status des Objekts (SqlPubWiz) im "Datenbankveröffentlichungsassistent" nicht gültig ist.

Nach so vielen Experimenten und Versuchen, in dieser App. Der Datenbankname unterscheidet zwischen Groß- und Kleinschreibung. Geben Sie den korrekten Fallwert für den Parameter -d ein.Die Lösung ist einfach: Ändern Sie den Namen des Standardschemas oder den Namen des ursprünglichen Katalogs wie "Wird beim Erstellen der Datenbank verwendet". Z.B. Verwenden Sie playground auch bei der Erstellung, wenn playGround verwendet wird ... Playground, Playground oder PlayGround erzeugen diesen Fehler.

Ich hoffe diese Hilfe!