Programmingバックエンド開発者

SQLにおけるDDLとDMLコマンドの違いを説明し、例を挙げて、実際にどのようにアクセス権とトランザクションに影響するかを説明してください。

Hintsage AIアシスタントで面接を突破

回答

DDL (データ定義言語) は、データベースの構造を定義するために設計された言語であり(テーブル、スキーマ、インデックスの作成、変更、削除など)、以下に例を示します:

  • コマンドの例: CREATE TABLE, ALTER TABLE, DROP TABLE
  • DDLコマンドは通常、データベースに自動的にコミットされます(autocommit)、つまり、変更を元に戻すのが難しいです。

DML (データ操作言語) は、テーブルのコンテンツを操作するための言語であり(行の追加、変更、削除、選択など)、以下に例を示します:

  • コマンドの例: INSERT, UPDATE, DELETE, SELECT
  • DMLコマンドは通常、トランザクションにラップされており、コミットするまでそれらをロールバックすることが可能です。

例えば、異なるユーザーがDMLまたはDDLのみに異なる権限を持つことができます:

  • 一般的なアプリケーションでは、データベースの構造を偶然に変更できないようにDDLを禁止することがよくあります;
  • データ操作のためにDMLは許可されます。

例:

-- DDL: テーブルの作成 CREATE TABLE users ( id INT PRIMARY KEY, name VARCHAR(100) ); -- DML: データの挿入 INSERT INTO users (id, name) VALUES (1, 'Ivan');

意地悪な質問

「DDLコマンド(例えば、DROP TABLE)が明示的なトランザクション内で実行された場合、ロールバックできますか?」

ほとんどのDBMS(例えば、PostgreSQL、Oracle)はDDLのトランザクションをサポートしていますが、明示的にトランザクションにラップされていても、DDLコマンドをロールバックすることを許可しないものも多いです。MySQLでは、DDLコマンドは常に即座にコミットされます。

例:
BEGIN; DROP TABLE employees; ROLLBACK;

ほとんどの場合、テーブルはロールバックされても永久に削除されます。

このテーマの微妙な点を知らないことによる実際のエラーの例


事例

DROP TABLEを偶然に実行した結果、開発環境でテーブルを失いました — コマンドはロールバックされても元に戻せません。


事例

組織がプロジェクトに管理権限を与え、バグが原因でALTERを通じてデータベースの構造を大量に変更し、サービスが長時間停止し、注文の損失を引き起こしました。


事例

DDL権限を新人に拒否したところ、デプロイ用の移行手続きにはDDLアクセスが必要であることをチームは忘れ、非常時に役職を引き上げられた後、数時間の調査の末にリリースが失敗しました。