SQLのDML構文の中で一番単純なのがDELETE文。
PostgreSQL(8.2)の場合は以下のような構文を持つ。
DELETE FROM <relation>[USING <relation, ...>] [WHERE <condition>] [RETURNING <expr1,...>]
アクセス権を評価しなければならないのは、以下の対象について。
- DELETEの対象であるテーブルに対してtable:delete権限
- DELETEの対象であるタプルに対してtuple:delete権限
- USING句で指定されたテーブルに対してtable:select権限
- WHERE句で使用されたカラムに対してcolumn:select権限
- WHERE句で使用されたプロシジャに対してprocedure:execute権限
- RETURNING句で使用されたカラムに対してcolumn:select権限
これに関してはJoshua Brindleが賛意を示すものの、Russell Cockerはカラムに対するアクセス権を評価すべきとの主張だが、各カラム毎のDELETEという操作が原理的に存在しない以上、私はcolumn:deleteというアクセスベクタは不要と考える。
幾つかのselect権限に関しては、やや理解が困難かもしれない。USING句やWHERE句を用いてDELETE条件を指定することができるが、これはカラムの読み出しに相当するという考えに基づいている。
例えば、DELETE from hogehoge WHERE name = 'kaigai'; という操作を行い、その結果削除された行数をカウントすることで、DELETE操作であってもデータ内容を知ることができるからである。
RETURNING句はより直接的にデータ内容をクライアントに返却する。これはPostgreSQL8.2から採用される拡張SQL構文で、DELETEした結果の行をクライアントに返却する。このため、DELETE操作にも関わらずselectの権限を要求する。