Enabling and disabling column-level conflict resolution#
bdr.alter_table_conflict_detection() ファンクションは、列レベルの競合解決を管理します。
bdr.alter_table_conflict_detectionを使用して列レベルの競合解決を有効にする#
bdr.alter_table_conflict_detection ファンクションは、テーブル名と列名を引数として受け取ります。列はcolumn_modify_timestamp
列としてテーブルに追加されます。また、ファンクションは、各変更の前に新しい列のタイムスタンプを維持する2つのトリガーBEFORE
INSERTおよびBEFORE UPDATEも追加します。
db=# CREATE TABLE my_app.test_table (id SERIAL PRIMARY KEY, val INT);
CREATE TABLE
db=# ALTER TABLE my_app.test_table REPLICA IDENTITY FULL;
ALTER TABLE
db=# SELECT bdr.alter_table_conflict_detection(
db(# my_app.test_table::regclass,
db(# column_modify_timestamp, cts);
alter_table_conflict_detection
- -------------------------------
t
db=# \d my_app.test_table
Table "my_app.test_table"
Column | Type | Collation | Nullable | Default
- -------+-----------------------+-----------+----------+--------------------------------------------------
id | integer | | not null | nextval(my_app.test_table_id_seq::regclass)
val | integer | | |
cts | bdr.column_timestamps | | not null | s 1 775297963454602 0 0::bdr.column_timestamps
Indexes:
"test_table_pkey" PRIMARY KEY, btree (id)
Triggers:
bdr_clcd_before_insert BEFORE INSERT ON my_app.test_table FOR EACH ROW EXECUTE FUNCTION bdr.column_timestamps_current_insert()
bdr_clcd_before_update BEFORE UPDATE ON my_app.test_table FOR EACH ROW EXECUTE FUNCTION bdr.column_timestamps_current_update()
新しい列は、デフォルト値でNOT NULL を指定します。これは、
ALTER TABLE ... ADD COLUMN
がテーブルリライトを実行しないことを意味します。
注釈
bdr.column_timestamps データ型の列を他の目的で使用することは避けてください。悪影響を与える可能性があります。たとえば、テーブルを列レベルの競合解決に切り替えますが、これはトリガーがなしでは正しく機能しません。
列レベルの競合解決を使用したテーブルのリスト#
次のクエリーを使用して、列レベルの競合解決が有効になっているテーブルをリストできます。
SELECT nc.nspname, c.relname
FROM pg_attribute a
JOIN (pg_class c JOIN pg_namespace nc ON c.relnamespace = nc.oid)
ON a.attrelid = c.oid
JOIN (pg_type t JOIN pg_namespace nt ON t.typnamespace = nt.oid)
ON a.atttypid = t.oid
WHERE NOT pg_is_other_temp_schema(nc.oid)
AND nt.nspname = bdr
AND t.typname = column_timestamps
AND NOT a.attisdropped
AND c.relkind IN (r, v, f, p);
このクエリーは、bdr.column_timestamp 型の列の存在を検出します。