Удаление нескольких таблиц одновременно - PullRequest
4 голосов
/ 17 июня 2019

SQL Server поддерживает синтаксис DIE ( удалить таблицу, если существует ):

Несколько таблиц могут быть удалены в любой базе данных.Если отбрасываемая таблица ссылается на первичный ключ другой таблицы, которая также отбрасывается, таблица ссылок с внешним ключом должна быть указана перед таблицей, содержащей первичный ключ, на который ссылается.


Пример:

CREATE TABLE t1(i INT PRIMARY KEY);
CREATE TABLE t2(i INT PRIMARY KEY);
CREATE TABLE t3(i INT PRIMARY KEY, t2_id INT REFERENCES t2(i));

Правильный способ отбрасывания объектов: t1 / t3 и, наконец, t2.

Допустим, мы выполняем:

DROP TABLE IF EXISTS t1,t2,t3;
-- Could not drop object 't2' because it is referenced by a FOREIGN KEY constraint.

Всекак и ожидалось, DDL не может завершиться успешно, поскольку имеется удержание FK.

Теперь я ожидал, что для DDL должно выполняться поведение "все или ничего" .Таким образом, у меня все еще должны быть мои 3 стола в целости.Но это не так, таблицы t1 и t3 были удалены.

SELECT * FROM t1;
-- Invalid object name 't1'.

SELECT * FROM t2;
SELECT * FROM t3;
-- Invalid object name 't3'.

db <> fiddle demo

Это выглядит внутреннеон выполняется как 3 независимых оператора отбрасывания, что нечетно.

Есть ли какая-то причина, по которой таблицы t1 и t3 исчезли или я упустил что-то очевидное?

1 Ответ

0 голосов
/ 17 июня 2019

Проблема в том, что СУБД отбросит любую возможную таблицу, но эта операция не является атомарной.Если вам нужно атомарное выражение, вы можете использовать условный ROLLBACK в транзакции (подробнее см. здесь )

...