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 型の列の存在を検出します。