DELETE文でのアクセス制御

SQLDML構文の中で一番単純なのがDELETE文。
PostgreSQL(8.2)の場合は以下のような構文を持つ。

DELETE FROM <relation>[USING <relation, ...>] [WHERE <condition>] [RETURNING <expr1,...>]

アクセス権を評価しなければならないのは、以下の対象について。
  1. DELETEの対象であるテーブルに対してtable:delete権限

  2. DELETEの対象であるタプルに対してtuple:delete権限

  3. USING句で指定されたテーブルに対してtable:select権限

  4. WHERE句で使用されたカラムに対してcolumn:select権限

  5. WHERE句で使用されたプロシジャに対してprocedure:execute権限

  6. RETURNING句で使用されたカラムに対してcolumn:select権限
テーブルとタプルに対するdelete権限は自明。DELETEは各カラム毎には作用しないため、column:deleteというアクセスベクタは存在せず、評価も行わない。
これに関しては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の権限を要求する。