2010-12-28 20 views
7

Vorrei ottenere i dettagli di tutti gli indici, le chiavi e le chiavi esterne da un database in SQL Server (2008). Come faccio a fare questo?Come script indici, chiavi, chiavi esterne in SQL Server

Ho intenzione di usarlo per sincronizzare queste proprietà attraverso un paio di database in qualche modo simili.

Posso utilizzare SQL Server Management Studio, ma non riesco a eseguire un backup completo di un database a causa delle restrizioni impostate dall'hoster web.

-

questione secondaria che non c'è bisogno di rispondere:

Perché non ci può essere qualcosa di simile allo schema del database in MySQL che elenca semplicemente tutta la struttura del database in script SQL di testo formato?

+0

Mi piacerebbe farlo da una sceneggiatura. In Mysql vorrei fare "show create table exampletablename" per ogni tabella. – tomsv

risposta

6

Supponendo che si sta utilizzando atleast SQL Server 2005 o superiore, è possibile utilizzare il Database Publishing Wizard script schema

Questo può essere usato per generare script per solo lo schema, i dati o entrambi.

Si integra direttamente in Visual Studio 2005 e/o Visual Web Developer 2005

Se si sta utilizzando VS2008, la versione v1.2 di pubblicazione guidata SQL viene pre-installato. Puoi controllare here da dove invocarlo.

+0

+1, è davvero fantastico. –

+0

ottengo un errore da questo quando provo a pubblicare lo schema: der Stato Datenbankveröffentlichung - Liste der Oggetti für die Skripterstellung wird zusammengestellt (Erfolg) - Skripterstellung für Oggetti (Fehler) Meldungen operazione non è valida a causa di lo stato attuale dell'oggetto. (SqlPubWiz) - Skript wird auf den Datenträger geschrieben (Beendet) (Ci scusiamo per i messaggi di errore tedeschi) – tomsv

+0

lo stai eseguendo dalla riga di comando o tramite VS? – InSane

1

In alternativa alla risposta perfetta di InSane, è possibile fare clic con il pulsante destro del mouse su qualsiasi oggetto in SSMS per copiarlo in un file di testo o in una finestra.
Alcuni prodotti gratuiti e non gratuiti consentono anche di questo, tra cui WinSQL.

2

Se avete bisogno di ottenere script da T-SQL allora solo utilizzando xp_cmdshell. Ad esempio scripting indice concreate di vista concreate con SMO e PowerShell (risultato è variabile @Script, è possibile eseguire con sp_executesql):

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. Per chi chiede perché potremmo aver bisogno di trucchi del genere: in alcuni scenari, ad es. "importa i dati usando lo strumento di terze parti", l'approccio "drop-recreate" funziona meglio degli oggetti "enable-disable", ad es. perché tale strumento di terze parti può chiamare "truncate" e se la tua tabella partecipa alla vista vincolata allo schema si otterrà un errore di strumento di terze parti (la tabella troncante che partecipa alle viste indicizzate genera un errore, quindi siamo costretti ad abbandonare la vista con tutti gli indici prima di importare e ricrearlo dopo).

0

Ho visto il commento o la risposta dell'utente "dontomoso". Dopo la traduzione in inglese sembra che "l'operazione non è valida a causa dello stato corrente dell'oggetto (SqlPubWiz)" nella "procedura guidata di pubblicazione del database" è l'errore riscontrato.

Dopo tanti esperimenti e prove, in questa app. il nome del database è case sensitive. Inserisci il valore case-case corretto per il parametro -d.La soluzione è semplice, cambia il nome dello schema predefinito o il nome del catalogo iniziale come "usato durante la creazione del DB". Per esempio. Durante la creazione di playGround, usa anche playGround qui ... Il campo da gioco o il parco giochi o PlayGround generano questo errore.

Spero che questo aiuto!

Problemi correlati