Come script di indici, chiavi, chiavi esterne in SQL Server

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

Ho intenzione di usare questo per sincronizzare queste proprietà in un paio di un po ‘ simile database.

Posso utilizzare SQL Server Management Studio, ma non posso fare un backup completo di un database a causa di restrizioni previste dal servizio di hosting web.

Secondaria questione che non è necessario rispondere:

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

  • Vorrei fare questo da uno script. In Mysql vorrei fare “show create table exampletablename” per ogni tabella.
InformationsquelleAutor tomsv | 2010-12-28



6 Replies
  1. 6

    Supponendo che si sta utilizzando atleast SQL Server 2005 o superiore, è possibile utilizzare il Pubblicazione Guidata Database di script schema

    Questo può essere utilizzato per generare script per il solo schema, di dati o di entrambi.

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

    Se si utilizza VS2008, v1.2 versione di SQL Pubblicazione Guidata viene fornito pre-installato. È possibile controllare qui dove richiamarlo da.

    • Ho un errore quando cerco di pubblicare lo schema:Stato der Datenbankveröffentlichung – Liste der Objekte für die Skripterstellung wird zusammengestellt (Erfolg) – Skripterstellung für Objekte (Fehler) Meldungen Operazione non valida a causa dell’attuale stato dell’oggetto. (SqlPubWiz) – Script wird auf den Datenträger ” geschrieben (decima è finita) (Scusate per il tedesco messaggi di errore)
    • sono in esecuzione da riga di comando o tramite VS?
  2. 2

    Se avete bisogno di ottenere script T-SQL, quindi utilizzando solo xp_cmdshell.
    Per esempio di script concreate indice di concreate vista con SMO e powershell (il risultato è in @variabile di 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]srv+'''')
    SET @ps=REPLACE(@ps,'$ln',''''[email protected]ln+'''')
    SET @ps=REPLACE(@ps,'$pw',''''[email protected]pw+'''')
    SET @ps=REPLACE(@ps,'$db',''''[email protected]db+'''')
    
    SET @ps=REPLACE(@ps,'$schemaName',''''[email protected]schemaName+'''')
    SET @ps=REPLACE(@ps,'$viewName',''''[email protected]viewName+'''')
    SET @ps=REPLACE(@ps,'$indexName',''''[email protected]indexName+'''')
    
    SET @cmd = 'powershell -Command "'[email protected]psLoadAssemblies[email protected]ps+'"'
    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é abbiamo bisogno di questi trucchi: in alcuni scenari, ad esempio “importare i dati utilizzando il tool di terze parti”, l’approccio “drop-ricreare” funziona meglio di “abilitare-disabilitare” degli oggetti, ad esempio a causa di tale strumento di terze parti può chiamare “truncate” e se la tabella partecipa schema di vista associata si otterrà uno strumento di terze parti errore (errore di troncamento tabella che partecipa viste indicizzate genera un errore, quindi siamo costretti ad eliminare la vista con tutti gli indici prima di importare e ricrearlo dopo).

  3. 1

    Come alternativa a Folle la risposta perfetta, è possibile fare clic su qualsiasi oggetto in SSMS di script in un file di testo o di una finestra.

    Un paio di free e non-free prodotti consentono anche di questo, tra cui WinSQL.

  4. 0

    Ho visto il commento o la risposta dell’utente “dontomoso”. Dopo la traduzione in inglese sembra che l’Operazione “non è valido a causa dell’attuale stato dell’oggetto. (SqlPubWiz)” in “pubblicazione guidata database” è l’errore esperti.

    Dopo tanti esperimenti e prove, in questa applicazione. il nome del database è case sensitive. Metti caso corretto valore per il parametro-d. La soluzione è semplice, basta cambiare il nome dello schema predefinito Iniziale o di Catalogo nome stesso come “utilizzato durante la Creazione di DB”. E. g. Durante la creazione di se giochi non viene utilizzato per giochi anche qui…nel parco Giochi o nel parco giochi o nel parco Giochi, deve generare questo errore.

    Spero che questo aiuto!

Lascia un commento