128 votes

Est-il possible de faire reculer le CREATE TABLE et ALTER TABLE des déclarations dans les grandes bases de données SQL?

Je suis en train de travailler sur un programme que les questions DDL. Je voudrais savoir si CREATE TABLE et similaires DDL peuvent être restaurées dans

  • Postgres
  • MySQL
  • SQLite
  • et al

Décrire comment chaque base de données gère les transactions avec DDL.

172voto

joeforker Points 14483

http://wiki.postgresql.org/wiki/Transactional_DDL_in_PostgreSQL:_A_Competitive_Analysis fournit une vue d'ensemble de cette question à partir de PostgreSQL.

Est DDL transactionnelle selon ce document?

  • PostgreSQL - oui
  • MySQL - pas; DDL provoque un commit implicite
  • Oracle Database 11g Release 2 et au-dessus - oui (quelque chose qui s'appelle edition redéfinition)
  • Les anciennes versions de Oracle - pas; DDL provoque un commit implicite
  • SQL Server - oui
  • Sybase Adaptive Server - oui
  • DB2 - oui
  • Informix - oui
  • Firebird (Interbase) - oui

SQLite semble également avoir transactionnelle DDL. J'ai été en mesure d' ROLLBACK un CREATE TABLE énoncé dans SQLite. Ses CREATE TABLE documentation ne fait pas mention toute spéciale transactionnel 'pièges'.

34voto

araqnid Points 33350

PostgreSQL a transactionnelle DDL pour la plupart des objets de base de données (certainement des tables, des indices, etc, mais pas de bases de données, les utilisateurs). Toutefois pratiquement n'importe quel DDL obtiendrez un ACCESS EXCLUSIVE verrou sur l'objet cible, ce qui le rend complètement inaccessible jusqu'à ce que le DDL transaction se termine. Aussi, pas toutes les situations sont très traités - par exemple, si vous essayez de sélectionner à partir de la table foo tandis qu'une autre opération est en baisse et la création d'une table de remplacement foo, puis l'a bloqué la transaction vont enfin recevoir une erreur plutôt que de trouver de nouveaux foo table. (Edit: ceci a été corrigé dans ou avant PostgreSQL 9.3)

CREATE INDEX ... CONCURRENTLY est exceptionnel, il utilise trois opérations pour ajouter un index à une table, tout en permettant les mises à jour simultanées, de sorte qu'il ne peut lui-même être exécutée dans une transaction.

Aussi la maintenance de la base de commandement VACUUM ne peut pas être utilisé dans une transaction.

4voto

Dave Costa Points 25282

Alors qu'il n'est pas à proprement parler une "restauration", dans Oracle le retour de flamme de commande peut être utilisé pour annuler ces types de changements, si la base de données a été configuré pour le soutenir.

-13voto

Marcela Rocha Points 42

Je ne sais pas SQLite, mais je sais que dans: MySQL, Postgres, Oracle et SQL Server vous ne pouvez pas restaurer des instructions DDL, parce qu'ils ne sont pas à la transaction.

La seule SGBDR je sais qui vous permet de restauration des instructions DDL est Firebird.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X