Можно ли откатить инструкции CREATE TABLE и ALTER TABLE в основных базах данных SQL?


Я работаю над программой, которая выдает DDL. Я хотел бы знать, если CREATE TABLE и аналогичный DDL можно откатить в

  • Postgres
  • MySQL
  • SQLite
  • et al

опишите, как каждая база данных обрабатывает транзакции с DDL.

4 88

4 ответа:

http://wiki.postgresql.org/wiki/Transactional_DDL_in_PostgreSQL:_A_Competitive_Analysis предоставляет обзор этой проблемы с точки зрения PostgreSQL.

является ли DDL транзакционным в соответствии с этим документом?

  • PostgreSQL-да
  • MySQL-нет; DDL вызывает неявную фиксацию
  • Oracle Database 11g Release 2 и выше - по умолчанию нет, но альтернатива называется переопределением на основе выпуска существует
  • старые версии Oracle-нет; DDL вызывает неявную фиксацию
  • SQL Server-да
  • адаптивный сервер Sybase-да
  • в DB2 - да
  • в Informix - да
  • Firebird (Interbase) - да

SQLite также, похоже,имеет транзакционный DDL. Я смог ROLLBACK a CREATE TABLE оператор в SQLite. Его CREATE TABLE в документации не упоминается никаких специальных транзакций 'подводных камней'.

PostgreSQL имеет транзакционный DDL для большинства объектов базы данных (конечно, таблицы, индексы и т. д., но не базы данных, пользователи). Однако практически любой DDL получит ACCESS EXCLUSIVE блокировка целевого объекта, что делает его полностью недоступным до завершения транзакции DDL. Кроме того, не все ситуации вполне справляются - например, если вы пытаетесь выбрать из таблицы foo в то время как другая транзакция отбрасывает его и создает таблицу замены foo, то заблокированная транзакция будет окончательно получите сообщение об ошибке вместо поиска нового foo таблица. (Edit: это было исправлено в PostgreSQL 9.3 или до него)

CREATE INDEX ... CONCURRENTLY является исключительным, он использует три транзакции для добавления индекса в таблицу, позволяя одновременные обновления, поэтому он не может быть выполнен в транзакции.

также команда обслуживания базы данных VACUUM не может использоваться в транзакции.

хотя это, строго говоря, не" откат", в Oracle команда FLASHBACK может использоваться для отмены этих типов изменений, если база данных была настроена для ее поддержки.

не может быть сделано с помощью MySQL Кажется, очень глупо, но правда... (согласно принятому ответу)

"оператор CREATE TABLE в InnoDB обрабатывается как одна транзакция. Это означает, что откат от пользователя не отменяет инструкции CREATE TABLE, сделанные пользователем во время этой транзакции."

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

попробовал несколько разных способов, и он просто не будет катиться спина..

обойти - это просто установить флаг сбоя и сделать "drop table tblname", если один из запросов не удался..