TRUNCATE文

PostgreSQLにはTRUNCATE文という構文がある。
これは、指定したテーブルを丸ごと消してしまうというSQL構文で、意味論的には無条件のDELETEと同一だが、メリットとして処理速度が高いことが挙げられている。

セキュリティの側面から見た場合、PostgreSQLネイティブのアクセス制御は、テーブル単位の粒度しか持っていないので、テーブルに対するDELETE権限を持っていれば万事OKとなる。だが、SE-PostgreSQLの場合はタプル単位でDELETEを制御することが可能なので、こういった構文を認めるわけにはいかない。

なので、TRUNCATE文が入力された場合には、自動的にDELETE文に変換するようにして、DELETE権限のないタプルは消さないように修正した。つまり、SE-PostgreSQLでは事実上、TRUNCATE文のメリットは存在せず、互換性のために構文書き換えを提供する。

外部キーの扱いがやや面倒だが、いかなる方法によっても権限の無いタプルを消去させるわけにはいかないので、更新不整合の発生する場合にはトランザクションをアボートさせることで対処することになるだろう。

この辺、一般のDELETE/UPDATEでも外部キーのCASCADE制約はやや扱いが面倒。うむむむ。