Группы операторов SQL

Классификация помогает читать документацию и понимать границы транзакций, но конкретная СУБД может относить один оператор к другой группе и по-разному выполнять неявный commit.

ГруппаНазначениеПримеры
DDLструктура схемыCREATE, ALTER, DROP, TRUNCATE
DMLчтение и изменение строкSELECT, INSERT, UPDATE, DELETE, MERGE
TCLуправление транзакциейCOMMIT, ROLLBACK, SAVEPOINT
DCLправа доступаGRANT, REVOKE

DDL

CREATE INDEX idx_orders_user_created
    ON orders (user_id, created_at);

DDL меняет метаданные. Нельзя переносить поведение транзакций DDL между PostgreSQL, MySQL, Oracle и другими СУБД без проверки: где-то операция транзакционна, где-то приводит к неявному commit или имеет отдельные ограничения.

DML

UPDATE orders
SET state = 'CANCELLED'
WHERE id = 42
  AND state = 'NEW';

Условие по текущему состоянию делает переход проверяемым: по количеству обновленных строк можно понять, состоялся ли он.

TCL

BEGIN;
UPDATE orders SET state = 'PAID' WHERE id = 42;
SAVEPOINT after_order;
INSERT INTO items (id, order_id, sku, quantity, price)
VALUES (100, 42, 'A-1', 1, 500.00);
COMMIT;

SAVEPOINT позволяет откатить часть работы, но не заменяет проектирование одной атомарной бизнес-операции.

DCL

GRANT SELECT ON orders TO reporting_role;
REVOKE UPDATE ON orders FROM reporting_role;

Права лучше выдавать ролям и по принципу минимально необходимых полномочий.

Ловушки

  • TRUNCATE нельзя считать просто «быстрым DELETE»: блокировки, триггеры, внешние ключи и транзакционность зависят от СУБД.
  • SELECT не всегда только чтение: существуют SELECT ... FOR UPDATE, функции с побочными эффектами и чтение последовательностей.
  • права на таблицу не обязательно дают права на последовательность, функцию или схему.

Связано: Сравнение TRUNCATE и DELETE, Транзакции принцип ACID, Ограничения, constraints.

Вопросы

К какой группе относится SELECT? Обычно к DML; иногда отдельно выделяют DQL.

Всегда ли DDL делает commit? Нет, это зависит от СУБД и конкретной операции.

Зачем нужны роли? Чтобы управлять наборами прав, а не повторять выдачу прав каждому пользователю.