Est-il possible de faire reculer les instructions CREATE TABLE et ALTER TABLE dans les principales bases de données SQL?

StackOverflow https://stackoverflow.com/questions/4692690

Question

Je travaille sur un programme que les questions DDL. Je voudrais savoir si CREATE TABLE et peuvent être similaires DDL révulsés dans

  • Postgres
  • MySQL
  • SQLite
  • et al

Décrivez comment chaque base de données des transactions avec des poignées LDD.

Était-ce utile?

La solution

http://wiki.postgresql.org/wiki/Transactional_DDL_in_PostgreSQL:_A_Competitive_Analysis fournit un aperçu de cette question du point de vue de PostgreSQL.

est transactionnel selon DDL ce document?

  • PostgreSQL - oui
  • MySQL - non; Provoque une commettras DDL implicite
  • Release 2 et au-dessus de la base de données Oracle - par défaut, non, mais une alternative appelée redéfinition Edition-based existe
  • Les anciennes versions d'Oracle - non; Provoque une commettras DDL implicite
  • SQL Server - yes
  • Sybase Adaptive Server - oui
  • DB2 - yes
  • Informix - oui
  • Firebird (Interbase) - oui

SQLite semble aussi avoir transactionnel DDL aussi bien. J'ai pu ROLLBACK une déclaration de CREATE TABLE dans SQLite. Sa documentation CREATE TABLE ne mentionne aucune transaction particulière 'gotchas'.

Autres conseils

PostgreSQL a transactionnel pour les objets DDL la plupart des bases de données (certainement des tables, indices, etc, mais pas les bases de données, les utilisateurs). Cependant pratiquement tous les DDL obtenir un verrou ACCESS EXCLUSIVE sur l'objet cible, ce qui rend totalement inaccessible jusqu'à ce que les finitions de transaction DDL. En outre, toutes les situations sont tout à fait handled- par exemple, si vous essayez de sélectionner à partir du tableau foo alors qu'une autre transaction est en baisse et la création d'une table de remplacement foo, la transaction bloquée va enfin recevoir une erreur plutôt que de trouver la nouvelle table de foo. (Edit: ceci a été fixé 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 des mises à jour simultanées, donc il ne peut pas lui-même être réalisée dans une transaction.

En outre la commande de maintenance de base de données VACUUM ne peut pas être utilisé dans une transaction.

Bien qu'il ne parle pas strictement un « rollback », dans Oracle la commande FLASHBACK peut être utilisée pour annuler ces types de changements, si la base de données a été configuré pour le soutenir.

ne peut pas être fait avec MySQL il semble, très stupide, mais vrai ... (selon la réponse acceptée)

  

"L'instruction CREATE TABLE InnoDB est traitée comme une seule   transaction. Cela signifie qu'un ROLLBACK de l'utilisateur n'annule   CREATE TABLE l'utilisateur fait au cours de cette transaction. "

https://dev.mysql.com/doc /refman/5.7/en/implicit-commit.html

Essayé quelques façons différentes et il sera tout simplement impossible de revenir ..

Les travaux autour de simplement définir un indicateur d'échec et faire « drop table tblname » si l'une des requêtes a échoué ..

On dirait les autres réponses sont assez obsolètes.

2019:

  • Postgres a soutenu pendant de nombreuses transactions DDL versions.
  • SQLite a soutenu pendant de nombreuses transactions DDL versions.
  • MySQL a soutenu atomique depuis 8,0 DDL (qui a été publié en 2018).
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top