2009-06-25 11 views
28

Mi chiedo se è possibile eseguire più istruzioni DDL all'interno di una transazione. Sono particolarmente interessato a SQL Server, anche se potrebbero essere interessanti anche le risposte con altri database (Oracle, PostgreSQL).È possibile eseguire più istruzioni DDL all'interno di una transazione (all'interno di SQL Server)?

Ho fatto alcuni "CREATE TABLE" e "CREATE VIEW" per la tabella creata all'interno di una transazione e sembrano esserci alcune incongruenze e mi chiedo se i DDL non dovrebbero essere fatti all'interno della transazione. ..

Probabilmente potrei spostare il DDL fuori dalla transazione ma Mi piacerebbe avere qualche riferimento per questo. Quello che ho trovato fino a questo punto:

  • MSDN pagina Isolation Levels in the Database Engine dice chiaramente che ci sono restrizioni su cosa operazioni DDL possono essere eseguite in una transazione esplicita è in esecuzione con isolamento dello snapshot - ma io non sto usando l'isolamento dello snapshot e questo dovrebbe risultare come un errore.
    • Questo potrebbe essere interpretato in modo che le operazioni DDL possano essere eseguite in una transazione esplicita con diversi livelli di isolamento?
  • Oracle® Database Gateway for SQL Server User's Guide#DDL Statements afferma che una sola istruzione DDL può essere eseguito in una determinata operazione - è questo vale anche per SQL Server utilizzato dritto?

Per Oracle:

Se è importante, lo faccio con Java tramite il driver JDBC JTDS.

b.r. Touko

risposta

1

Potrebbe essere che in MS SQL, le transazioni implicite vengano attivate quando vengono eseguite istruzioni DDL e DML. Se si seleziona questo fuori fa questo aiuto, utilizzare IMPLICIT_TRANSACTIONS SET

EDIT: un'altra possibilità - Non è possibile combinare CREATE VIEW con altre affermazioni dello stesso lotto. CREATE TABLE è ok. Si separano i lotti con GO.

EDIT2: È possibile utilizzare più DDL in una transazione purché separati con GO per creare diversi batch.

+0

Sto utilizzando JDBC Connection # setAutoCommit (false) e le istruzioni DML non vengono eseguite con transazioni implicite. I risultati sembrano più come se la tabella per creare la vista con non sarebbe sempre lì o qualcosa del genere. – Touko

+0

Per EDIT: Potrebbe essere, ma vorrei qualche riferimento alla documentazione di SQL Server o qualcosa se è o non è consentito .. – Touko

+0

Ho usato questo libro, vedi se lo trovi online? Microsoft® SQL Server® 2008 Fondamenti T-SQL Stampa ISBN-10: 0-7356-2601-4 Stampa ISBN-13: 978-0-7356-2601-0 – Stuart

1

Per il caso generale e IIRC, non è sicuro assumere che le istruzioni DDL siano transazionali.

Vale a dire, c'è un ampio margine di manovra su come le alterazioni dello schema interagiscono all'interno di una transazione (supponendo che lo faccia affatto). Questo può essere fatto dal venditore o anche dall'installazione specifica (cioè fino al dba), credo. Quindi, per lo meno, non utilizzare un DBMS per supporre che altri tratteranno le affermazioni DDL.

Modifica: MySql è un esempio di DBMS che non supporta affatto le transazioni DDL.Inoltre, se si dispone di replica/mirroring del database, è necessario prestare molta attenzione al fatto che il servizio di replica (la replica di Sybase è la norma, che ci crediate o meno) replicherà effettivamente l'istruzione DDL.

4

Se si creano tabelle, viste, ecc al volo (diverse da variabili di tabella o tabelle temporanee), potrebbe essere necessario rivedere il proprio progetto. Questo non è roba che dovrebbe normalmente accadere dall'interfaccia utente. Anche se è necessario consentire alcune personalizzazioni, le istruzioni DDL non dovrebbero accadere contemporaneamente all'inserimento di inserimenti/aggiornamenti/eliminazioni transazionali. È molto meglio separare queste funzioni.

Questo è anche qualcosa che richiede una buona dose di considerazione e test su ciò che accade quando due utenti provano a cambiare la struttura della stessa tabella nello stesso momento e quindi eseguono una transazione per inserire i dati. C'è qualcosa di veramente spaventoso che può accadere quando si consente agli utenti di apportare modifiche alla struttura del database.

Anche alcune istruzioni DDL devono sempre essere la prima dichiarazione di un batch. Cercalo anche quando li stai facendo.

+0

Hai ottenuto buoni risultati, sfortunatamente con questo progetto sono costretto a questo design db legacy .. Questi batch sembrano essere un'unità di istruzioni di SQL Server. Probabilmente sto eseguendo tutte le mie istruzioni in batch separati con JDBC finché Lo voglio esplicitamente .. almeno penso .. – Touko

+18

Vorrei aggiungere che troverei le transazioni DDL molto utili per un diverso insieme di circostanze - non aggiornando al volo, ma assicurando che gli aggiornamenti dello schema a un database di produzione non vengano mai lasciati uno stato incoerente. – Nathan

+6

O per la migrazione degli schemi quando il DB è gestito completamente dall'applicazione e l'utente è passato da una versione precedente della tua app a una successiva. Tali migrazioni non dovrebbero mai fallire, ma se lo fanno è meglio se il DB viene lasciato nello stato di pre-migrazione. –

13

So che molti database hanno restrizioni, ma Postgres no. È possibile eseguire creazioni di tabelle numeriche, modifiche alle colonne e modifiche dell'indice in una transazione e le modifiche non sono visibili agli altri utenti che COMMIT ha esito positivo. Ecco come dovrebbero essere i database! :-)

Per quanto riguarda SQL Server è possibile eseguire DDL all'interno di una transazione, ma SQL Server does not version metadata, e così i cambiamenti sarebbero visibili ad altri prima di commit della transazione. Ma some DDL statements can be rolled back if you are in a transaction, ma per quali funzionano e quali no, è necessario eseguire alcuni test.

+2

Solo per rispondere al mio io stesso con un followup, due anni dopo ... Sebbene SQL Server non fornisca transazioni isolate per DDL, può eseguire il rollback di più istruzioni DDL che sono state parte di una transazione.Il mio collega ha appena eseguito un test su SQL Server 2008 R2: "Ho provato a creare una tabella, aggiungere una colonna chiave primaria, inserirla in un'altra tabella, aggiungere una colonna a un'altra tabella, inserirla e quindi forzare un errore con qualche SQL non valido tutto arrotolato correttamente! ". Assicurati solo che ogni istruzione DDL si trovi nel proprio batch (utilizzando il separatore GO). –

+1

Se il take away è "Non eseguire DDL nel server SQL mentre il database è in uso"? Come al solito, è normale usare una transazione per DDL purché nient'altro stia leggendo la tabella (il che significa che il tuo sito web dovrebbe essere inattivo mentre aggiorni il database, che probabilmente dovrebbe, comunque). – jpmc26

+0

Posso confermare che Ingres consente (almeno) le modifiche alle colonne come parte di una transazione CRUD più ampia. Probabilmente non sorprendente data la relazione Postgres/Ingres. – Sepster