9.
INSERT ON CONFLICT
INSERT文で制約違反が発生したらUPDATE文を実行
– 主キー列empid = 1000のタプルが存在しなければ
– INSERT INTO employees VALUES (1000, 'Shinoda', 'shinoda@hpe.com') が実行さ
れる
– 主キー列empid = 1000のタプルが存在すれば
– UPDATE employees SET ename='Shinoda', email='shinoda@hpe.com' WHERE
empid=1000 が実行される
– EXCLUDED句は、INSERT INTOで指定した値を指す
– 使用できる制約
– PRIMARY KEY, UNIQUE, EXCLUTION(排他制約)
9
INSERT INTO employees VALUES (1000, 'Shinoda', 'shinoda@hpe.com')
ON CONFLICT (empid)
DO UPDATE SET ename = EXCLUDED.ename, email = EXCLUDED.email
10.
INSERT ON CONFLICT
INSERT文で制約違反が発生したらUPDATE文を実行
– その他の構文
– 「DO NOTHING」を記述すると、制約違反が発生しても何もしない
– 「DO NOTHING」指定時は制約列名を省略できる
– 「ON CONFLICT ON CONSTRAINT 制約名」を記述すると、制約名を指定できる
– VALUES句だけではなく、INSERT SELECT文でも実行可能
10
INSERT INTO instab1 SELECT * FROM instab2
ON CONFLICT (pk_col1)
DO UPDATE SET valcol1 = EXCLUDED.valcol1
11.
INSERT ON CONFLICT
トリガーの動作
– INSERT ON CONFLICT文はINSERT文なのか?UPDATE文なのか?
– トリガーが特殊な動作になる
– EACH ROWトリガーの動作(数字は実行順)
11
Trigger INSERT
成功
DO
NOTHING
DO UPDATE
(更新あり)
DO UPDATE
(更新なし)
BEFORE INSERT ①実行 ①実行 ①実行 ①実行
AFTER INSERT ②実行 - - -
BEFORE UPDATE - - ②実行 -
AFTER UPDATE - - ③実行 -
– DO UPDATE (更新なし)
– DO UPDATE句にWHERE句を指定し、更新されなかった場合。
12.
INSERT ON CONFLICT
トリガーの動作
– EACH STATEMENTトリガーの動作(数字は実行順)
12
Trigger INSERT
成功
DO
NOTHING
DO UPDATE
(更新あり)
DO UPDATE
(更新なし)
BEFORE INSERT ①実行 ①実行 ①実行 ①実行
AFTER INSERT ④実行 ②実行 ④実行 ④実行
BEFORE UPDATE ②実行 - ②実行 ②実行
AFTER UPDATE ③実行 - ③実行 ③実行
15.
Row Level Security
利用方法
– テーブルに対してRLSの有効化
– ポリシーの作成
– 対象となるテーブル(ON)
– 対象となる操作(FOR)
– 対象となるロール(TO)
– 許可する検索条件(USING)→ WHERE句条件
– 許可する更新条件(WITH CHECK) → WHERE句条件
15
ALTER TABLE table_name ENABLE ROW LEVEL SECURITY
CREATE POLICY policy_name ON table_name
[ FOR { ALL | SELECT | INSERT | UPDATE | DELETE } ]
[ TO role_name | PUBLIC [, …] ]
[ USING (expression) ]
[ WITH CHECK (expression) ]
16.
Row Level Security
実行例
– ポリシーの作成とRLS有効化
16
postgres(owner)=> ALTER TABLE employees ENABLE ROW LEVEL SECURITY ;
ALTER TABLE
postgres(owner)=> GRANT SELECT ON employees TO PUBLIC ;
postgres(owner)=> CREATE POLICY pol1 ON employees
FOR SELECT TO PUBLIC
USING (dept = current_user) ;
CREATE POLICY
postgres(marketing)=> SELECT name, dept FROM employees ;
name | dept
---------+-----------
Sato | marketing
Hayashi | marketing
(2 rows)
17.
Row Level Security
実行例
– 実行計画
17
postgres=> ¥d+ rls1
Table "public.rls1"
Column | Type | Modifiers | Storage | Stats target | Description
--------+-----------------------+-----------+----------+--------------+-------------
c1 | character varying(10) | | extended | |
c2 | character varying(10) | | extended | |
Policies:
POLICY "rls1_p1" FOR ALL
USING (((c1)::name = "current_user"()))
POLICY "rls1_p2" FOR ALL
USING (((c2)::text = 'data'::text))
postgres=> EXPLAIN SELECT * FROM rls1 ;
QUERY PLAN
----------------------------------------------------------------------------------
Seq Scan on rls1 (cost=0.00..22.00 rows=6 width=108)
Filter: (((c2)::text = 'data'::text) OR ((c1)::name = "current_user"()))
(2 rows)
36.
pg_rewind
レプリケーション環境の再同期
– PostgreSQL 9.4まで
① マスター・インスタンスの異常終了
② スレーブ・インスタンスを昇格
③ 旧マスター・インスタンスのデータを削除し、全データをコピーし再設定
– PostgreSQL 9.5
① マスター・インスタンスの異常終了
② スレーブ・インスタンスを昇格
③ pg_rewindコマンドで旧マスターを差分更新
36
Wal History
プロモートされた
旧スレーブ
旧マスター
① Rewind
② Replay
39.
ALTER TABLE SET UNLOGGED / LOGGED
更新時のWAL出力量を制御
– 更新処理(INSERT, UPDATE, DELETE)実行時にはWALが出力
– データベース障害時の復旧に使用
– pg_xlogディレクトリ内の16MBのファイル群
– OLTP環境ではパフォーマンス・ボトルネック
– PostgreSQL 9.5ではテーブル単位にWALの生成を切り替え可能に
– UNLOGGEDテーブルはpg_classカタログのrelpersistence = 'u'
– TEMPORARY TABLEからの変更は不可
39
ALTER TABLE テーブル名 SET UNLOGGED
ALTER TABLE テーブル名 SET LOGGED
40.
ALTER TABLE SET UNLOGGED / LOGGED
更新時のWAL出力量を制御
– 内部実装は?
– 新規テーブルの作成とデータのコピーを実行
– ALTER TABLE WITH[OUT] OID文, ALTER TABLE ALTER TYPE文と同じ動作
40
postgres=> SELECT pg_relation_filepath('logged1') ;
pg_relation_filepath
----------------------
base/16385/41347
(1 row)
postgres=> ALTER TABLE logged1 SET UNLOGGED ;
ALTER TABLE
postgres=> SELECT pg_relation_filepath('logged1') ;
pg_relation_filepath
----------------------
base/16385/41353
(1 row)
41.
優先順位の変更
演算子の優先順位が変更された
41
IS
(other operator)
IN
BETWEEN
OVERLAPS
< >
=
(other operator)
OVERLAPS
BETWEEN
IN
LIKE
ILIKE
SIMILAR
< > = <= >=
IS
IS NULL
NOT NULL
IS NULL
NOT NULL
LIKE ILIKE
SIMILAR
42.
優先順位の変更
演算子の優先順位が変更された
– 優先順位の変更により影響を受けるSQLに警告を出力するパラメーター
42
– 実行例
operator_precedence_warning (デフォルトoff)
postgres=> SET operator_precedence_warning = on ;
SET
postgres=> SELECT COUNT(*) FROM sample1 WHERE c1 > 10 IS true ;
WARNING: operator precedence change: IS is now lower precedence than >
LINE 1: SELECT COUNT(*) FROM sample1 WHERE c1 > 10 IS true ;
count
--------
999990
(1 row)
43.
インスタンス停止モード
デフォルト値の変更
– pg_ctl stopコマンドの停止モードのデフォルトが変更された
43
PostgreSQL 9.4までのデフォルト
・pg_ctl stop -D data -m smart
PostgreSQL 9.5のデフォルト
・pg_ctl stop -D data -m fast
Clipping is a handy way to collect and organize the most important slides from a presentation. You can keep your great finds in clipboards organized around topics.
Be the first to comment