INSERT INTO laputa VALUES (5, 'バルス')

バルス!!!

なんか社内のYammerで

新規登録をミスって全削除しちゃうってどんなUIになってるんだ

みたいな話題がちょっと流れていたので、なんとなくこんな下らないことをイメージしてしまった。

[nuko] psql laputa
psql (9.3.2)
Type "help" for help.

laputa=# SELECT * FROM laputa ;
 id |  data  
----+--------
  1 | パズー
  2 | シータ
  3 | ドーラ
(3 rows)

laputa=# INSERT INTO laputa VALUES (4, 'ムスカ');
INSERT 0 1
laputa=# SELECT * FROM laputa ;
 id |  data  
----+--------
  1 | パズー
  2 | シータ
  3 | ドーラ
  4 | ムスカ
(4 rows)

laputa=# INSERT INTO laputa VALUES (5, 'バルス');
INSERT 0 1
laputa=# SELECT * FROM laputa ;
 id | data 
----+------
(0 rows)

laputa=# 

dataカラムに'バルス'をINSERTしようとすると、テーブル内容が全滅するlaputaテーブル・・・

バルスの仕組み

こんなトリガ定義をするとバルスで全滅するテーブルが設定できるw

CREATE TABLE laputa(id int, data text);
CREATE OR REPLACE FUNCTION insert_after_row_col_trig_func() RETURNS trigger AS $$
BEGIN
   IF (NEW.data = 'バルス') THEN
     DELETE FROM laputa;
   END IF;
   RETURN NULL;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER insert_after_row_col_trig AFTER insert ON laputa FOR EACH ROW
EXECUTE PROCEDURE insert_after_row_col_trig_func();

補足

DELETEのところをTRUNCATEしようとしても、これはうまく行かない。

ERROR:  cannot TRUNCATE "laputa" because it is being used by active queries in this session

DELETEと違ってTRUNCATEではテーブルファイルそのものを削除→0バイトで再生成するからなんだろうな・・・

いいわけ

うん、そうなんだ。気分が乗らないから本来やるべき執筆をサボってるんだw