@taopao/memoir 0.0.0-stage → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +8 -2
- package/assets/migrations-pg/0100_baseline.sql +1115 -0
- package/assets/migrations-pg/0101_functions.sql +93 -0
- package/assets/migrations-pg/0102_views.sql +2425 -0
- package/assets/migrations-pg/0103_constraints.sql +147 -0
- package/assets/migrations-pg/0104_protection.sql +33 -0
- package/assets/migrations-pg/0105_bocom_credit_card.sql +43 -0
- package/assets/migrations-pg/0106_psbc_debit_card.sql +87 -0
- package/assets/migrations-pg/0107_tailong_debit_card.sql +87 -0
- package/assets/migrations-pg/0108_ccb_debit_card.sql +87 -0
- package/assets/migrations-pg/0109_ccb_credit_card.sql +63 -0
- package/assets/migrations-pg/0110_icbc_debit_card.sql +87 -0
- package/assets/migrations-pg/0111_icbc_credit_card.sql +66 -0
- package/assets/migrations-pg/0112_boc_debit_card.sql +88 -0
- package/assets/migrations-pg/0113_jsb_debit_card.sql +88 -0
- package/assets/migrations-pg/0114_cmbc_debit_card.sql +88 -0
- package/assets/migrations-pg/0115_hzbank_debit_card.sql +88 -0
- package/assets/migrations-pg/0116_unified_bank_documents.sql +197 -0
- package/assets/migrations-pg/0117_agent_submissions.sql +50 -0
- package/assets/migrations-pg/0118_agent_reversions_analysis.sql +34 -0
- package/assets/migrations-pg/0119_agent_extension_registry.sql +72 -0
- package/assets/migrations-pg/0120_agent_record_sources.sql +22 -0
- package/assets/migrations-pg/0121_agent_extension_deprecation.sql +30 -0
- package/assets/migrations-pg/0122_agent_extension_controlled_revert.sql +107 -0
- package/assets/migrations-pg/0123_agent_extension_versions.sql +54 -0
- package/assets/migrations-pg/0124_agent_extension_retirement_groups.sql +26 -0
- package/assets/migrations-pg/0125_agent_candidate_reviews.sql +30 -0
- package/assets/migrations-pg/0126_agent_module_lifecycle.sql +93 -0
- package/assets/migrations-pg/0127_agent_tasks.sql +64 -0
- package/assets/migrations-pg/0128_agent_task_leases.sql +80 -0
- package/assets/migrations-pg/0129_agent_task_plans.sql +66 -0
- package/assets/migrations-pg/0130_agent_task_submissions.sql +72 -0
- package/assets/migrations-pg/0131_agent_task_completions.sql +93 -0
- package/assets/migrations-pg/0132_agent_task_changes.sql +113 -0
- package/assets/migrations-pg/0133_agent_imported_source_snapshots.sql +152 -0
- package/assets/migrations-pg/0134_agent_analysis_datasets.sql +6 -0
- package/assets/migrations-pg/0135_agent_maintenance_tasks.sql +139 -0
- package/assets/migrations-pg/0136_agent_task_structures.sql +66 -0
- package/assets/migrations-pg/0137_agent_personal_identity.sql +149 -0
- package/assets/migrations-pg/0138_agent_work_records.sql +24 -0
- package/assets/migrations-pg/0139_shared_files.sql +43 -0
- package/assets/migrations-pg/0140_shared_script_runs.sql +36 -0
- package/assets/migrations-pg/0141_payment_bank_links.sql +96 -0
- package/assets/migrations-pg/0142_consumption_order_types_and_places.sql +287 -0
- package/assets/migrations-pg/0143_skill_direct_write.sql +330 -0
- package/assets/migrations-pg/0144_skill_schema_archive.sql +73 -0
- package/assets/migrations-pg/0145_skill_ingest_wiki.sql +91 -0
- package/assets/migrations-pg/0146_skill_load.sql +17 -0
- package/assets/migrations-pg/0147_drop_agent_schema.sql +147 -0
- package/assets/migrations-pg/0148_ingest_lanes.sql +19 -0
- package/assets/migrations-pg/0149_account_ownership.sql +233 -0
- package/assets/migrations-pg/0150_bank_card_exact_link.sql +24 -0
- package/assets/migrations-pg/0151_account_ownership_enforce.sql +35 -0
- package/assets/migrations-pg/0152_account_ownership_views.sql +750 -0
- package/assets/migrations-pg/0153_web_frontend.sql +34 -0
- package/assets/migrations-pg/0154_audio_record_owners.sql +103 -0
- package/assets/migrations-pg/0155_ingest_knowledge_tables.sql +171 -0
- package/assets/migrations-pg/0156_batch_playbook_note.sql +17 -0
- package/assets/migrations-pg/0157_last_contact.sql +166 -0
- package/assets/migrations-pg/0158_refund_match_hash_join.sql +91 -0
- package/assets/migrations-pg/0159_fact_occurred_time.sql +88 -0
- package/assets/migrations-pg/0160_agent_notes.sql +118 -0
- package/assets/migrations-pg/0161_life_history.sql +314 -0
- package/assets/migrations-pg/0162_person_card.sql +427 -0
- package/assets/migrations-pg/0163_parking_drop_personal_defaults.sql +12 -0
- package/assets/native/darwin-arm64.node +0 -0
- package/assets/playbooks/audio.md +83 -0
- package/assets/playbooks/chat.md +37 -0
- package/assets/playbooks/common.md +66 -0
- package/assets/playbooks/intimate.md +19 -0
- package/assets/playbooks/journal.md +17 -0
- package/assets/playbooks/orders.md +15 -0
- package/assets/playbooks/payments.md +16 -0
- package/assets/playbooks/self.md +29 -0
- package/bin/install-codex-skill.mjs +77 -0
- package/bin/memoir.mjs +5 -0
- package/dist/cli.js +34062 -0
- package/package.json +40 -4
- package/release-manifest.json +432 -0
- package/skill/SKILL.md +120 -0
- package/skill/references//345/256/211/350/243/205/344/275/215/347/275/256.md +21 -0
- package/skill/references//346/225/260/346/215/256/345/217/243/345/276/204.md +36 -0
- package/skill/scripts/memoir.mjs +82 -0
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
-- 数据搬迁完成后安装外键,再逐条验证。
|
|
2
|
+
ALTER TABLE "analysis_terms" ADD CONSTRAINT "fk_analysis_terms_1" FOREIGN KEY ("person_id") REFERENCES persons (id) NOT VALID;
|
|
3
|
+
ALTER TABLE "audio_records" ADD CONSTRAINT "fk_audio_records_1" FOREIGN KEY ("first_batch_id") REFERENCES import_batches (id) NOT VALID;
|
|
4
|
+
ALTER TABLE "audio_records" ADD CONSTRAINT "fk_audio_records_2" FOREIGN KEY ("last_batch_id") REFERENCES import_batches (id) NOT VALID;
|
|
5
|
+
ALTER TABLE "audio_sentences" ADD CONSTRAINT "fk_audio_sentences_1" FOREIGN KEY ("record_sha1") REFERENCES audio_records (sha1) NOT VALID;
|
|
6
|
+
ALTER TABLE "audio_sentences" ADD CONSTRAINT "fk_audio_sentences_2" FOREIGN KEY ("first_batch_id") REFERENCES import_batches (id) NOT VALID;
|
|
7
|
+
ALTER TABLE "audio_sentences" ADD CONSTRAINT "fk_audio_sentences_3" FOREIGN KEY ("last_batch_id") REFERENCES import_batches (id) NOT VALID;
|
|
8
|
+
ALTER TABLE "audio_summaries" ADD CONSTRAINT "fk_audio_summaries_1" FOREIGN KEY ("record_sha1") REFERENCES audio_records (sha1) NOT VALID;
|
|
9
|
+
ALTER TABLE "audio_summaries" ADD CONSTRAINT "fk_audio_summaries_2" FOREIGN KEY ("first_batch_id") REFERENCES import_batches (id) NOT VALID;
|
|
10
|
+
ALTER TABLE "audio_summaries" ADD CONSTRAINT "fk_audio_summaries_3" FOREIGN KEY ("last_batch_id") REFERENCES import_batches (id) NOT VALID;
|
|
11
|
+
ALTER TABLE "bank_card_statements" ADD CONSTRAINT "fk_bank_card_statements_1" FOREIGN KEY ("first_batch_id") REFERENCES import_batches(id) NOT VALID;
|
|
12
|
+
ALTER TABLE "bank_card_statements" ADD CONSTRAINT "fk_bank_card_statements_2" FOREIGN KEY ("last_batch_id") REFERENCES import_batches(id) NOT VALID;
|
|
13
|
+
ALTER TABLE "bank_card_transactions" ADD CONSTRAINT "fk_bank_card_transactions_1" FOREIGN KEY ("first_batch_id") REFERENCES import_batches(id) NOT VALID;
|
|
14
|
+
ALTER TABLE "bank_card_transactions" ADD CONSTRAINT "fk_bank_card_transactions_2" FOREIGN KEY ("last_batch_id") REFERENCES import_batches(id) NOT VALID;
|
|
15
|
+
ALTER TABLE "bank_card_transactions" ADD CONSTRAINT "fk_bank_card_transactions_3" FOREIGN KEY ("statement_key") REFERENCES bank_card_statements(statement_key) NOT VALID;
|
|
16
|
+
ALTER TABLE "beneficiaries" ADD CONSTRAINT "fk_beneficiaries_1" FOREIGN KEY ("person_id") REFERENCES persons (id) NOT VALID;
|
|
17
|
+
ALTER TABLE "credit_card_statements" ADD CONSTRAINT "fk_credit_card_statements_1" FOREIGN KEY ("first_batch_id") REFERENCES import_batches(id) NOT VALID;
|
|
18
|
+
ALTER TABLE "credit_card_statements" ADD CONSTRAINT "fk_credit_card_statements_2" FOREIGN KEY ("last_batch_id") REFERENCES import_batches(id) NOT VALID;
|
|
19
|
+
ALTER TABLE "credit_card_transactions" ADD CONSTRAINT "fk_credit_card_transactions_1" FOREIGN KEY ("statement_key") REFERENCES credit_card_statements(statement_key) NOT VALID;
|
|
20
|
+
ALTER TABLE "credit_card_transactions" ADD CONSTRAINT "fk_credit_card_transactions_2" FOREIGN KEY ("first_batch_id") REFERENCES import_batches(id) NOT VALID;
|
|
21
|
+
ALTER TABLE "credit_card_transactions" ADD CONSTRAINT "fk_credit_card_transactions_3" FOREIGN KEY ("last_batch_id") REFERENCES import_batches(id) NOT VALID;
|
|
22
|
+
ALTER TABLE "event_links" ADD CONSTRAINT "fk_event_links_1" FOREIGN KEY ("event_id") REFERENCES events (id) NOT VALID;
|
|
23
|
+
ALTER TABLE "event_participants" ADD CONSTRAINT "fk_event_participants_1" FOREIGN KEY ("event_id") REFERENCES events (id) NOT VALID;
|
|
24
|
+
ALTER TABLE "event_participants" ADD CONSTRAINT "fk_event_participants_2" FOREIGN KEY ("person_id") REFERENCES persons (id) NOT VALID;
|
|
25
|
+
ALTER TABLE "events" ADD CONSTRAINT "fk_events_1" FOREIGN KEY ("parent_event_id") REFERENCES events (id) NOT VALID;
|
|
26
|
+
ALTER TABLE "families" ADD CONSTRAINT "fk_families_1" FOREIGN KEY ("anchor_person_id") REFERENCES persons (id) NOT VALID;
|
|
27
|
+
ALTER TABLE "families" ADD CONSTRAINT "fk_families_2" FOREIGN KEY ("parent_family_id") REFERENCES families (id) NOT VALID;
|
|
28
|
+
ALTER TABLE "family_members" ADD CONSTRAINT "fk_family_members_1" FOREIGN KEY ("family_id") REFERENCES families (id) NOT VALID;
|
|
29
|
+
ALTER TABLE "family_members" ADD CONSTRAINT "fk_family_members_2" FOREIGN KEY ("person_id") REFERENCES persons (id) NOT VALID;
|
|
30
|
+
ALTER TABLE "gift_ideas" ADD CONSTRAINT "fk_gift_ideas_1" FOREIGN KEY ("for_person_id") REFERENCES persons (id) NOT VALID;
|
|
31
|
+
ALTER TABLE "gift_ideas" ADD CONSTRAINT "fk_gift_ideas_2" FOREIGN KEY ("wish_id") REFERENCES wishes (id) NOT VALID;
|
|
32
|
+
ALTER TABLE "gift_ideas" ADD CONSTRAINT "fk_gift_ideas_3" FOREIGN KEY ("given_event_id") REFERENCES events (id) NOT VALID;
|
|
33
|
+
ALTER TABLE "health_events" ADD CONSTRAINT "fk_health_events_1" FOREIGN KEY ("person_id") REFERENCES persons (id) NOT VALID;
|
|
34
|
+
ALTER TABLE "identities" ADD CONSTRAINT "fk_identities_1" FOREIGN KEY ("person_id") REFERENCES persons (id) NOT VALID;
|
|
35
|
+
ALTER TABLE "import_changes" ADD CONSTRAINT "fk_import_changes_1" FOREIGN KEY ("batch_id") REFERENCES import_batches (id) NOT VALID;
|
|
36
|
+
ALTER TABLE "import_files" ADD CONSTRAINT "fk_import_files_1" FOREIGN KEY ("batch_id") REFERENCES import_batches (id) NOT VALID;
|
|
37
|
+
ALTER TABLE "important_dates" ADD CONSTRAINT "fk_important_dates_1" FOREIGN KEY ("person_id") REFERENCES persons (id) NOT VALID;
|
|
38
|
+
ALTER TABLE "intimacy_events" ADD CONSTRAINT "fk_intimacy_events_1" FOREIGN KEY ("person_id") REFERENCES persons (id) NOT VALID;
|
|
39
|
+
ALTER TABLE "intimacy_events" ADD CONSTRAINT "fk_intimacy_events_2" FOREIGN KEY ("partner_id") REFERENCES persons (id) NOT VALID;
|
|
40
|
+
ALTER TABLE "journal_entries" ADD CONSTRAINT "fk_journal_entries_1" FOREIGN KEY ("author_id") REFERENCES persons (id) NOT VALID;
|
|
41
|
+
ALTER TABLE "journal_entries" ADD CONSTRAINT "fk_journal_entries_2" FOREIGN KEY ("about_person_id") REFERENCES persons (id) NOT VALID;
|
|
42
|
+
ALTER TABLE "menstrual_cycles" ADD CONSTRAINT "fk_menstrual_cycles_1" FOREIGN KEY ("person_id") REFERENCES persons (id) NOT VALID;
|
|
43
|
+
ALTER TABLE "menstrual_daily_logs" ADD CONSTRAINT "fk_menstrual_daily_logs_1" FOREIGN KEY ("person_id") REFERENCES persons (id) NOT VALID;
|
|
44
|
+
ALTER TABLE "menstrual_daily_logs" ADD CONSTRAINT "fk_menstrual_daily_logs_2" FOREIGN KEY ("cycle_id") REFERENCES menstrual_cycles (id) NOT VALID;
|
|
45
|
+
ALTER TABLE "order_items" ADD CONSTRAINT "fk_order_items_1" FOREIGN KEY ("first_batch_id") REFERENCES import_batches (id) NOT VALID;
|
|
46
|
+
ALTER TABLE "order_items" ADD CONSTRAINT "fk_order_items_2" FOREIGN KEY ("last_batch_id") REFERENCES import_batches (id) NOT VALID;
|
|
47
|
+
ALTER TABLE "order_items" ADD CONSTRAINT "fk_order_items_3" FOREIGN KEY (platform, order_no) REFERENCES orders (platform, order_no) NOT VALID;
|
|
48
|
+
ALTER TABLE "orders" ADD CONSTRAINT "fk_orders_1" FOREIGN KEY ("first_batch_id") REFERENCES import_batches (id) NOT VALID;
|
|
49
|
+
ALTER TABLE "orders" ADD CONSTRAINT "fk_orders_2" FOREIGN KEY ("last_batch_id") REFERENCES import_batches (id) NOT VALID;
|
|
50
|
+
ALTER TABLE "payment_order_links" ADD CONSTRAINT "fk_payment_order_links_1" FOREIGN KEY (payment_platform, payment_txn_id) REFERENCES payments (platform, txn_id) NOT VALID;
|
|
51
|
+
ALTER TABLE "payment_order_links" ADD CONSTRAINT "fk_payment_order_links_2" FOREIGN KEY (order_platform, order_no) REFERENCES orders (platform, order_no) NOT VALID;
|
|
52
|
+
ALTER TABLE "payments" ADD CONSTRAINT "fk_payments_1" FOREIGN KEY ("first_batch_id") REFERENCES import_batches (id) NOT VALID;
|
|
53
|
+
ALTER TABLE "payments" ADD CONSTRAINT "fk_payments_2" FOREIGN KEY ("last_batch_id") REFERENCES import_batches (id) NOT VALID;
|
|
54
|
+
ALTER TABLE "person_aliases" ADD CONSTRAINT "fk_person_aliases_1" FOREIGN KEY ("person_id") REFERENCES persons (id) NOT VALID;
|
|
55
|
+
ALTER TABLE "preferences" ADD CONSTRAINT "fk_preferences_1" FOREIGN KEY ("person_id") REFERENCES persons (id) NOT VALID;
|
|
56
|
+
ALTER TABLE "private_profiles" ADD CONSTRAINT "fk_private_profiles_1" FOREIGN KEY ("person_id") REFERENCES persons (id) NOT VALID;
|
|
57
|
+
ALTER TABLE "profile_facts" ADD CONSTRAINT "fk_profile_facts_1" FOREIGN KEY ("person_id") REFERENCES persons (id) NOT VALID;
|
|
58
|
+
ALTER TABLE "promise_checks" ADD CONSTRAINT "fk_promise_checks_1" FOREIGN KEY ("promise_id") REFERENCES promises (id) NOT VALID;
|
|
59
|
+
ALTER TABLE "promises" ADD CONSTRAINT "fk_promises_1" FOREIGN KEY ("promiser_id") REFERENCES persons (id) NOT VALID;
|
|
60
|
+
ALTER TABLE "promises" ADD CONSTRAINT "fk_promises_2" FOREIGN KEY ("recipient_id") REFERENCES persons (id) NOT VALID;
|
|
61
|
+
ALTER TABLE "relations" ADD CONSTRAINT "fk_relations_1" FOREIGN KEY ("from_person_id") REFERENCES persons (id) NOT VALID;
|
|
62
|
+
ALTER TABLE "relations" ADD CONSTRAINT "fk_relations_2" FOREIGN KEY ("to_person_id") REFERENCES persons (id) NOT VALID;
|
|
63
|
+
ALTER TABLE "todos" ADD CONSTRAINT "fk_todos_1" FOREIGN KEY ("owner_id") REFERENCES persons (id) NOT VALID;
|
|
64
|
+
ALTER TABLE "todos" ADD CONSTRAINT "fk_todos_2" FOREIGN KEY ("related_person_id") REFERENCES persons (id) NOT VALID;
|
|
65
|
+
ALTER TABLE "train_tickets" ADD CONSTRAINT "fk_train_tickets_1" FOREIGN KEY ("first_batch_id") REFERENCES import_batches (id) NOT VALID;
|
|
66
|
+
ALTER TABLE "train_tickets" ADD CONSTRAINT "fk_train_tickets_2" FOREIGN KEY ("last_batch_id") REFERENCES import_batches (id) NOT VALID;
|
|
67
|
+
ALTER TABLE "wechat_messages" ADD CONSTRAINT "fk_wechat_messages_1" FOREIGN KEY ("session_key") REFERENCES wechat_sessions (session_key) NOT VALID;
|
|
68
|
+
ALTER TABLE "wechat_messages" ADD CONSTRAINT "fk_wechat_messages_2" FOREIGN KEY ("first_batch_id") REFERENCES import_batches (id) NOT VALID;
|
|
69
|
+
ALTER TABLE "wechat_messages" ADD CONSTRAINT "fk_wechat_messages_3" FOREIGN KEY ("last_batch_id") REFERENCES import_batches (id) NOT VALID;
|
|
70
|
+
ALTER TABLE "wechat_sessions" ADD CONSTRAINT "fk_wechat_sessions_1" FOREIGN KEY ("first_batch_id") REFERENCES import_batches (id) NOT VALID;
|
|
71
|
+
ALTER TABLE "wechat_sessions" ADD CONSTRAINT "fk_wechat_sessions_2" FOREIGN KEY ("last_batch_id") REFERENCES import_batches (id) NOT VALID;
|
|
72
|
+
ALTER TABLE "wiki_revisions" ADD CONSTRAINT "fk_wiki_revisions_1" FOREIGN KEY ("slug") REFERENCES wiki_pages (slug) NOT VALID;
|
|
73
|
+
ALTER TABLE "wishes" ADD CONSTRAINT "fk_wishes_1" FOREIGN KEY ("person_id") REFERENCES persons (id) NOT VALID;
|
|
74
|
+
ALTER TABLE "wishes" ADD CONSTRAINT "fk_wishes_2" FOREIGN KEY ("done_event_id") REFERENCES events (id) NOT VALID;
|
|
75
|
+
ALTER TABLE "analysis_terms" VALIDATE CONSTRAINT "fk_analysis_terms_1";
|
|
76
|
+
ALTER TABLE "audio_records" VALIDATE CONSTRAINT "fk_audio_records_1";
|
|
77
|
+
ALTER TABLE "audio_records" VALIDATE CONSTRAINT "fk_audio_records_2";
|
|
78
|
+
ALTER TABLE "audio_sentences" VALIDATE CONSTRAINT "fk_audio_sentences_1";
|
|
79
|
+
ALTER TABLE "audio_sentences" VALIDATE CONSTRAINT "fk_audio_sentences_2";
|
|
80
|
+
ALTER TABLE "audio_sentences" VALIDATE CONSTRAINT "fk_audio_sentences_3";
|
|
81
|
+
ALTER TABLE "audio_summaries" VALIDATE CONSTRAINT "fk_audio_summaries_1";
|
|
82
|
+
ALTER TABLE "audio_summaries" VALIDATE CONSTRAINT "fk_audio_summaries_2";
|
|
83
|
+
ALTER TABLE "audio_summaries" VALIDATE CONSTRAINT "fk_audio_summaries_3";
|
|
84
|
+
ALTER TABLE "bank_card_statements" VALIDATE CONSTRAINT "fk_bank_card_statements_1";
|
|
85
|
+
ALTER TABLE "bank_card_statements" VALIDATE CONSTRAINT "fk_bank_card_statements_2";
|
|
86
|
+
ALTER TABLE "bank_card_transactions" VALIDATE CONSTRAINT "fk_bank_card_transactions_1";
|
|
87
|
+
ALTER TABLE "bank_card_transactions" VALIDATE CONSTRAINT "fk_bank_card_transactions_2";
|
|
88
|
+
ALTER TABLE "bank_card_transactions" VALIDATE CONSTRAINT "fk_bank_card_transactions_3";
|
|
89
|
+
ALTER TABLE "beneficiaries" VALIDATE CONSTRAINT "fk_beneficiaries_1";
|
|
90
|
+
ALTER TABLE "credit_card_statements" VALIDATE CONSTRAINT "fk_credit_card_statements_1";
|
|
91
|
+
ALTER TABLE "credit_card_statements" VALIDATE CONSTRAINT "fk_credit_card_statements_2";
|
|
92
|
+
ALTER TABLE "credit_card_transactions" VALIDATE CONSTRAINT "fk_credit_card_transactions_1";
|
|
93
|
+
ALTER TABLE "credit_card_transactions" VALIDATE CONSTRAINT "fk_credit_card_transactions_2";
|
|
94
|
+
ALTER TABLE "credit_card_transactions" VALIDATE CONSTRAINT "fk_credit_card_transactions_3";
|
|
95
|
+
ALTER TABLE "event_links" VALIDATE CONSTRAINT "fk_event_links_1";
|
|
96
|
+
ALTER TABLE "event_participants" VALIDATE CONSTRAINT "fk_event_participants_1";
|
|
97
|
+
ALTER TABLE "event_participants" VALIDATE CONSTRAINT "fk_event_participants_2";
|
|
98
|
+
ALTER TABLE "events" VALIDATE CONSTRAINT "fk_events_1";
|
|
99
|
+
ALTER TABLE "families" VALIDATE CONSTRAINT "fk_families_1";
|
|
100
|
+
ALTER TABLE "families" VALIDATE CONSTRAINT "fk_families_2";
|
|
101
|
+
ALTER TABLE "family_members" VALIDATE CONSTRAINT "fk_family_members_1";
|
|
102
|
+
ALTER TABLE "family_members" VALIDATE CONSTRAINT "fk_family_members_2";
|
|
103
|
+
ALTER TABLE "gift_ideas" VALIDATE CONSTRAINT "fk_gift_ideas_1";
|
|
104
|
+
ALTER TABLE "gift_ideas" VALIDATE CONSTRAINT "fk_gift_ideas_2";
|
|
105
|
+
ALTER TABLE "gift_ideas" VALIDATE CONSTRAINT "fk_gift_ideas_3";
|
|
106
|
+
ALTER TABLE "health_events" VALIDATE CONSTRAINT "fk_health_events_1";
|
|
107
|
+
ALTER TABLE "identities" VALIDATE CONSTRAINT "fk_identities_1";
|
|
108
|
+
ALTER TABLE "import_changes" VALIDATE CONSTRAINT "fk_import_changes_1";
|
|
109
|
+
ALTER TABLE "import_files" VALIDATE CONSTRAINT "fk_import_files_1";
|
|
110
|
+
ALTER TABLE "important_dates" VALIDATE CONSTRAINT "fk_important_dates_1";
|
|
111
|
+
ALTER TABLE "intimacy_events" VALIDATE CONSTRAINT "fk_intimacy_events_1";
|
|
112
|
+
ALTER TABLE "intimacy_events" VALIDATE CONSTRAINT "fk_intimacy_events_2";
|
|
113
|
+
ALTER TABLE "journal_entries" VALIDATE CONSTRAINT "fk_journal_entries_1";
|
|
114
|
+
ALTER TABLE "journal_entries" VALIDATE CONSTRAINT "fk_journal_entries_2";
|
|
115
|
+
ALTER TABLE "menstrual_cycles" VALIDATE CONSTRAINT "fk_menstrual_cycles_1";
|
|
116
|
+
ALTER TABLE "menstrual_daily_logs" VALIDATE CONSTRAINT "fk_menstrual_daily_logs_1";
|
|
117
|
+
ALTER TABLE "menstrual_daily_logs" VALIDATE CONSTRAINT "fk_menstrual_daily_logs_2";
|
|
118
|
+
ALTER TABLE "order_items" VALIDATE CONSTRAINT "fk_order_items_1";
|
|
119
|
+
ALTER TABLE "order_items" VALIDATE CONSTRAINT "fk_order_items_2";
|
|
120
|
+
ALTER TABLE "order_items" VALIDATE CONSTRAINT "fk_order_items_3";
|
|
121
|
+
ALTER TABLE "orders" VALIDATE CONSTRAINT "fk_orders_1";
|
|
122
|
+
ALTER TABLE "orders" VALIDATE CONSTRAINT "fk_orders_2";
|
|
123
|
+
ALTER TABLE "payment_order_links" VALIDATE CONSTRAINT "fk_payment_order_links_1";
|
|
124
|
+
ALTER TABLE "payment_order_links" VALIDATE CONSTRAINT "fk_payment_order_links_2";
|
|
125
|
+
ALTER TABLE "payments" VALIDATE CONSTRAINT "fk_payments_1";
|
|
126
|
+
ALTER TABLE "payments" VALIDATE CONSTRAINT "fk_payments_2";
|
|
127
|
+
ALTER TABLE "person_aliases" VALIDATE CONSTRAINT "fk_person_aliases_1";
|
|
128
|
+
ALTER TABLE "preferences" VALIDATE CONSTRAINT "fk_preferences_1";
|
|
129
|
+
ALTER TABLE "private_profiles" VALIDATE CONSTRAINT "fk_private_profiles_1";
|
|
130
|
+
ALTER TABLE "profile_facts" VALIDATE CONSTRAINT "fk_profile_facts_1";
|
|
131
|
+
ALTER TABLE "promise_checks" VALIDATE CONSTRAINT "fk_promise_checks_1";
|
|
132
|
+
ALTER TABLE "promises" VALIDATE CONSTRAINT "fk_promises_1";
|
|
133
|
+
ALTER TABLE "promises" VALIDATE CONSTRAINT "fk_promises_2";
|
|
134
|
+
ALTER TABLE "relations" VALIDATE CONSTRAINT "fk_relations_1";
|
|
135
|
+
ALTER TABLE "relations" VALIDATE CONSTRAINT "fk_relations_2";
|
|
136
|
+
ALTER TABLE "todos" VALIDATE CONSTRAINT "fk_todos_1";
|
|
137
|
+
ALTER TABLE "todos" VALIDATE CONSTRAINT "fk_todos_2";
|
|
138
|
+
ALTER TABLE "train_tickets" VALIDATE CONSTRAINT "fk_train_tickets_1";
|
|
139
|
+
ALTER TABLE "train_tickets" VALIDATE CONSTRAINT "fk_train_tickets_2";
|
|
140
|
+
ALTER TABLE "wechat_messages" VALIDATE CONSTRAINT "fk_wechat_messages_1";
|
|
141
|
+
ALTER TABLE "wechat_messages" VALIDATE CONSTRAINT "fk_wechat_messages_2";
|
|
142
|
+
ALTER TABLE "wechat_messages" VALIDATE CONSTRAINT "fk_wechat_messages_3";
|
|
143
|
+
ALTER TABLE "wechat_sessions" VALIDATE CONSTRAINT "fk_wechat_sessions_1";
|
|
144
|
+
ALTER TABLE "wechat_sessions" VALIDATE CONSTRAINT "fk_wechat_sessions_2";
|
|
145
|
+
ALTER TABLE "wiki_revisions" VALIDATE CONSTRAINT "fk_wiki_revisions_1";
|
|
146
|
+
ALTER TABLE "wishes" VALIDATE CONSTRAINT "fk_wishes_1";
|
|
147
|
+
ALTER TABLE "wishes" VALIDATE CONSTRAINT "fk_wishes_2";
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
-- 保护规则由共享表清单安装触发器,此文件定义稳定的数据库函数。
|
|
2
|
+
CREATE FUNCTION vault_guard() RETURNS trigger LANGUAGE plpgsql AS $$
|
|
3
|
+
DECLARE actor text := nullif(current_setting('vault.actor',true),'');
|
|
4
|
+
BEGIN
|
|
5
|
+
IF TG_OP='TRUNCATE' THEN RAISE EXCEPTION '禁止 TRUNCATE'; END IF;
|
|
6
|
+
IF actor IS NULL THEN RAISE EXCEPTION '未设置写入会话'; END IF;
|
|
7
|
+
IF TG_ARGV[0]='append' AND TG_OP IN('UPDATE','DELETE') THEN RAISE EXCEPTION '只增表禁止修改或删除'; END IF;
|
|
8
|
+
IF TG_ARGV[0]='fact' AND actor NOT IN('importer','migration') THEN RAISE EXCEPTION '事实表只允许导入程序修改'; END IF;
|
|
9
|
+
IF TG_TABLE_NAME='backup_log' AND TG_OP='DELETE' THEN RAISE EXCEPTION '备份记录不能删除'; END IF;
|
|
10
|
+
IF TG_TABLE_NAME='import_batches' THEN
|
|
11
|
+
IF TG_OP='DELETE' THEN RAISE EXCEPTION '导入批次不能删除'; END IF;
|
|
12
|
+
IF TG_OP='UPDATE' AND OLD.status<>'running' AND actor<>'migration' THEN RAISE EXCEPTION '已完成的导入批次不能修改'; END IF;
|
|
13
|
+
END IF;
|
|
14
|
+
IF TG_OP='DELETE' THEN RETURN OLD; END IF; RETURN NEW;
|
|
15
|
+
END $$;
|
|
16
|
+
CREATE FUNCTION vault_audit() RETURNS trigger LANGUAGE plpgsql AS $$
|
|
17
|
+
DECLARE item jsonb; row_key text; old_value text; new_value text;
|
|
18
|
+
BEGIN
|
|
19
|
+
item:=CASE WHEN TG_OP='DELETE' THEN to_jsonb(OLD) ELSE to_jsonb(NEW) END;
|
|
20
|
+
SELECT string_agg(item ->> key, ':' ORDER BY ord) INTO row_key FROM unnest(TG_ARGV) WITH ORDINALITY AS keys(key,ord);
|
|
21
|
+
IF TG_OP<>'INSERT' THEN old_value:=to_jsonb(OLD)::text; END IF;
|
|
22
|
+
IF TG_OP<>'DELETE' THEN new_value:=to_jsonb(NEW)::text; END IF;
|
|
23
|
+
INSERT INTO audit_log(at,actor,reason,table_name,row_key,op,before_json,after_json)
|
|
24
|
+
VALUES(to_char(clock_timestamp() AT TIME ZONE 'Asia/Shanghai','YYYY-MM-DD HH24:MI:SS'),current_setting('vault.actor'),nullif(current_setting('vault.reason',true),''),TG_TABLE_NAME,row_key,lower(TG_OP),old_value,new_value);
|
|
25
|
+
RETURN NULL;
|
|
26
|
+
END $$;
|
|
27
|
+
CREATE FUNCTION vault_touch() RETURNS trigger LANGUAGE plpgsql SECURITY DEFINER SET search_path=pg_catalog,public AS $$
|
|
28
|
+
BEGIN UPDATE public.vault_meta SET data_version=data_version+1 WHERE id=1; RETURN NULL; END $$;
|
|
29
|
+
REVOKE ALL ON FUNCTION vault_touch() FROM PUBLIC;
|
|
30
|
+
CREATE INDEX ix_search_docs_title_trgm ON search_docs USING gin(title gin_trgm_ops);
|
|
31
|
+
CREATE INDEX ix_search_docs_body_trgm ON search_docs USING gin(body gin_trgm_ops);
|
|
32
|
+
CREATE INDEX ix_wechat_messages_content_trgm ON wechat_messages USING gin(content gin_trgm_ops);
|
|
33
|
+
CREATE INDEX ix_wechat_messages_sender_trgm ON wechat_messages USING gin(sender_name gin_trgm_ops);
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
-- 交通银行信用卡逐笔明细新增来源 bocom_credit_card。
|
|
2
|
+
-- 该来源是把邮箱电子账单汇总成 xlsx(交易明细 + 账单对账两张表),不是银行 PDF 原件:
|
|
3
|
+
-- 没有 PDF 页码,也没有披露最低还款额,部分期数未给到期还款日。
|
|
4
|
+
-- 因此只放宽这三列为可空,并用「空值或正数」的约束替代原来的 > 0,
|
|
5
|
+
-- 既有中信、招商账单继续保存非空值,字段、自然键、原文和证据外键均不变。
|
|
6
|
+
ALTER TABLE "import_batches" DROP CONSTRAINT "import_batches_source_kind_check";
|
|
7
|
+
ALTER TABLE "import_batches"
|
|
8
|
+
ADD CONSTRAINT "import_batches_source_kind_check" CHECK (source_kind IN (
|
|
9
|
+
'wechat_chat', 'audio_db', 'alipay', 'wechatpay', 'jd', 'taobao', 'pdd',
|
|
10
|
+
'meituan', 'taobao_takeout', 'train12306', 'manual_ledger', 'legacy_md',
|
|
11
|
+
'citic_credit_card', 'citic_debit_card', 'cmb_debit_card', 'cmb_credit_card',
|
|
12
|
+
'bocom_debit_card', 'bocom_credit_card'
|
|
13
|
+
));
|
|
14
|
+
|
|
15
|
+
ALTER TABLE "credit_card_statements"
|
|
16
|
+
DROP CONSTRAINT "credit_card_statements_source_kind_check";
|
|
17
|
+
ALTER TABLE "credit_card_statements"
|
|
18
|
+
ADD CONSTRAINT "credit_card_statements_source_kind_check"
|
|
19
|
+
CHECK (source_kind IN ('citic_credit_card', 'cmb_credit_card', 'bocom_credit_card'));
|
|
20
|
+
|
|
21
|
+
ALTER TABLE "credit_card_statements" ALTER COLUMN "due_date" DROP NOT NULL;
|
|
22
|
+
ALTER TABLE "credit_card_statements" ALTER COLUMN "minimum_due_cents" DROP NOT NULL;
|
|
23
|
+
ALTER TABLE "credit_card_statements" ALTER COLUMN "page_number" DROP NOT NULL;
|
|
24
|
+
ALTER TABLE "credit_card_statements"
|
|
25
|
+
DROP CONSTRAINT "credit_card_statements_page_number_check";
|
|
26
|
+
ALTER TABLE "credit_card_statements"
|
|
27
|
+
ADD CONSTRAINT "credit_card_statements_page_number_check"
|
|
28
|
+
CHECK (page_number IS NULL OR page_number > 0);
|
|
29
|
+
|
|
30
|
+
-- 表格来源的逐笔交易同样没有页码:两个页码列要么同时为空,要么同时有值且顺序正确。
|
|
31
|
+
ALTER TABLE "credit_card_transactions" ALTER COLUMN "page_number" DROP NOT NULL;
|
|
32
|
+
ALTER TABLE "credit_card_transactions" ALTER COLUMN "end_page_number" DROP NOT NULL;
|
|
33
|
+
ALTER TABLE "credit_card_transactions"
|
|
34
|
+
DROP CONSTRAINT "credit_card_transactions_page_number_check";
|
|
35
|
+
ALTER TABLE "credit_card_transactions"
|
|
36
|
+
ADD CONSTRAINT "credit_card_transactions_page_number_check"
|
|
37
|
+
CHECK (page_number IS NULL OR page_number > 0);
|
|
38
|
+
ALTER TABLE "credit_card_transactions" DROP CONSTRAINT "credit_card_transactions_check";
|
|
39
|
+
ALTER TABLE "credit_card_transactions"
|
|
40
|
+
ADD CONSTRAINT "credit_card_transactions_check" CHECK (
|
|
41
|
+
(page_number IS NULL AND end_page_number IS NULL)
|
|
42
|
+
OR (page_number IS NOT NULL AND end_page_number IS NOT NULL AND end_page_number >= page_number)
|
|
43
|
+
);
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
-- 邮储借记账户历史明细使用专属事实表,既有银行记录、批次和审计不重写。
|
|
2
|
+
-- 只扩展批次来源枚举;时间精度、正负方向、原始十二列与原件批次外键明确保存。
|
|
3
|
+
ALTER TABLE import_batches DROP CONSTRAINT import_batches_source_kind_check;
|
|
4
|
+
ALTER TABLE import_batches ADD CONSTRAINT import_batches_source_kind_check CHECK (source_kind IN (
|
|
5
|
+
'wechat_chat', 'audio_db', 'alipay', 'wechatpay', 'jd', 'taobao', 'pdd',
|
|
6
|
+
'meituan', 'taobao_takeout', 'train12306', 'manual_ledger', 'legacy_md',
|
|
7
|
+
'citic_credit_card', 'citic_debit_card', 'cmb_debit_card', 'cmb_credit_card',
|
|
8
|
+
'bocom_debit_card', 'bocom_credit_card', 'psbc_debit_card'
|
|
9
|
+
));
|
|
10
|
+
|
|
11
|
+
CREATE TABLE "psbc_bank_statements" (
|
|
12
|
+
statement_key TEXT PRIMARY KEY,
|
|
13
|
+
source_kind TEXT NOT NULL CHECK (source_kind = 'psbc_debit_card'),
|
|
14
|
+
account_key TEXT NOT NULL,
|
|
15
|
+
account_masked TEXT NOT NULL,
|
|
16
|
+
owner_name TEXT NOT NULL,
|
|
17
|
+
account_type TEXT NOT NULL,
|
|
18
|
+
branch TEXT NOT NULL,
|
|
19
|
+
period_from TEXT NOT NULL,
|
|
20
|
+
period_to TEXT NOT NULL CHECK (period_to >= period_from),
|
|
21
|
+
requested_at TEXT NOT NULL,
|
|
22
|
+
verification_code TEXT NOT NULL,
|
|
23
|
+
page_count BIGINT NOT NULL CHECK (page_count > 0),
|
|
24
|
+
source_file TEXT NOT NULL,
|
|
25
|
+
source_sha256 TEXT NOT NULL,
|
|
26
|
+
first_batch_id TEXT NOT NULL REFERENCES import_batches(id),
|
|
27
|
+
last_batch_id TEXT NOT NULL REFERENCES import_batches(id),
|
|
28
|
+
raw_json TEXT NOT NULL CHECK (vault_json_valid(raw_json))
|
|
29
|
+
);
|
|
30
|
+
|
|
31
|
+
CREATE TABLE "psbc_bank_transactions" (
|
|
32
|
+
transaction_key TEXT PRIMARY KEY,
|
|
33
|
+
account_key TEXT NOT NULL,
|
|
34
|
+
account_masked TEXT NOT NULL,
|
|
35
|
+
card_last_four TEXT NOT NULL CHECK (length(card_last_four) = 4),
|
|
36
|
+
currency TEXT NOT NULL,
|
|
37
|
+
occurred_at TEXT NOT NULL,
|
|
38
|
+
direction TEXT NOT NULL CHECK (direction IN ('in', 'out', 'neutral')),
|
|
39
|
+
amount_cents BIGINT NOT NULL CHECK (amount_cents >= 0),
|
|
40
|
+
balance_cents BIGINT NOT NULL,
|
|
41
|
+
counterparty TEXT NOT NULL,
|
|
42
|
+
counterparty_account TEXT NOT NULL,
|
|
43
|
+
institution TEXT NOT NULL,
|
|
44
|
+
description TEXT NOT NULL,
|
|
45
|
+
bank_txn_id TEXT NOT NULL,
|
|
46
|
+
transaction_card TEXT NOT NULL,
|
|
47
|
+
status TEXT NOT NULL,
|
|
48
|
+
source_file TEXT NOT NULL,
|
|
49
|
+
source_sha256 TEXT NOT NULL,
|
|
50
|
+
source_sheet TEXT NOT NULL,
|
|
51
|
+
row_number BIGINT NOT NULL CHECK (row_number > 0),
|
|
52
|
+
first_batch_id TEXT NOT NULL REFERENCES import_batches(id),
|
|
53
|
+
last_batch_id TEXT NOT NULL REFERENCES import_batches(id),
|
|
54
|
+
raw_json TEXT NOT NULL CHECK (vault_json_valid(raw_json)),
|
|
55
|
+
source_kind TEXT NOT NULL DEFAULT 'psbc_debit_card' CHECK (source_kind = 'psbc_debit_card'),
|
|
56
|
+
date_precision TEXT NOT NULL DEFAULT 'second' CHECK (date_precision = 'second'),
|
|
57
|
+
page_number BIGINT NOT NULL CHECK (page_number > 0),
|
|
58
|
+
statement_key TEXT NOT NULL REFERENCES psbc_bank_statements(statement_key),
|
|
59
|
+
CHECK ((direction = 'neutral' AND amount_cents = 0) OR (direction IN ('in', 'out') AND amount_cents > 0))
|
|
60
|
+
);
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
CREATE INDEX ix_psbc_statement_account_period ON psbc_bank_statements(account_key, period_from, period_to);
|
|
64
|
+
CREATE INDEX ix_psbc_transaction_account_date ON psbc_bank_transactions(account_key, occurred_at);
|
|
65
|
+
CREATE INDEX ix_psbc_transaction_statement ON psbc_bank_transactions(statement_key);
|
|
66
|
+
|
|
67
|
+
-- 新表按原始事实保护,只有 importer/migration 会话可写;每行审计、数据版本和
|
|
68
|
+
-- TRUNCATE 防护与现有银行卡完全一致。增量 SQL 同时用于旧库升级和新库逐步安装。
|
|
69
|
+
DO $$
|
|
70
|
+
DECLARE target_table text; key_column text; grant_row record;
|
|
71
|
+
BEGIN
|
|
72
|
+
FOREACH target_table IN ARRAY ARRAY['psbc_bank_statements', 'psbc_bank_transactions'] LOOP
|
|
73
|
+
key_column := CASE WHEN target_table = 'psbc_bank_statements' THEN 'statement_key' ELSE 'transaction_key' END;
|
|
74
|
+
EXECUTE format('CREATE TRIGGER trg_%s_guard BEFORE INSERT OR UPDATE OR DELETE ON %I FOR EACH ROW EXECUTE FUNCTION vault_guard(''fact'')', target_table, target_table);
|
|
75
|
+
EXECUTE format('CREATE TRIGGER trg_%s_truncate BEFORE TRUNCATE ON %I FOR EACH STATEMENT EXECUTE FUNCTION vault_guard(''fact'')', target_table, target_table);
|
|
76
|
+
EXECUTE format('CREATE TRIGGER trg_%s_version AFTER INSERT OR UPDATE OR DELETE ON %I FOR EACH STATEMENT EXECUTE FUNCTION vault_touch()', target_table, target_table);
|
|
77
|
+
EXECUTE format('CREATE TRIGGER trg_%s_audit AFTER INSERT OR UPDATE OR DELETE ON %I FOR EACH ROW EXECUTE FUNCTION vault_audit(%L)', target_table, target_table, key_column);
|
|
78
|
+
-- 继承同类事实表的现有应用/只读权限,不写死部署角色,也不授予新的管理权限。
|
|
79
|
+
FOR grant_row IN SELECT grantee, privilege_type FROM information_schema.role_table_grants
|
|
80
|
+
WHERE table_schema = 'public' AND role_table_grants.table_name = 'bank_card_transactions'
|
|
81
|
+
AND grantee <> current_user AND privilege_type IN ('SELECT', 'INSERT', 'UPDATE', 'DELETE')
|
|
82
|
+
LOOP
|
|
83
|
+
EXECUTE format('GRANT %s ON TABLE %I TO %s', grant_row.privilege_type, target_table,
|
|
84
|
+
CASE WHEN grant_row.grantee = 'PUBLIC' THEN 'PUBLIC' ELSE quote_ident(grant_row.grantee) END);
|
|
85
|
+
END LOOP;
|
|
86
|
+
END LOOP;
|
|
87
|
+
END $$;
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
-- 泰隆借记账户对账单使用专属事实表,既有银行记录、批次和审计不重写。
|
|
2
|
+
-- 只扩展批次来源枚举;时间精度、正负方向、原始七列与原件批次外键明确保存。
|
|
3
|
+
ALTER TABLE import_batches DROP CONSTRAINT import_batches_source_kind_check;
|
|
4
|
+
ALTER TABLE import_batches ADD CONSTRAINT import_batches_source_kind_check CHECK (source_kind IN (
|
|
5
|
+
'wechat_chat', 'audio_db', 'alipay', 'wechatpay', 'jd', 'taobao', 'pdd',
|
|
6
|
+
'meituan', 'taobao_takeout', 'train12306', 'manual_ledger', 'legacy_md',
|
|
7
|
+
'citic_credit_card', 'citic_debit_card', 'cmb_debit_card', 'cmb_credit_card',
|
|
8
|
+
'bocom_debit_card', 'bocom_credit_card', 'psbc_debit_card', 'tailong_debit_card'
|
|
9
|
+
));
|
|
10
|
+
|
|
11
|
+
CREATE TABLE "tailong_bank_statements" (
|
|
12
|
+
statement_key TEXT PRIMARY KEY,
|
|
13
|
+
source_kind TEXT NOT NULL CHECK (source_kind = 'tailong_debit_card'),
|
|
14
|
+
account_key TEXT NOT NULL,
|
|
15
|
+
account_masked TEXT NOT NULL,
|
|
16
|
+
owner_name TEXT NOT NULL,
|
|
17
|
+
account_type TEXT NOT NULL,
|
|
18
|
+
branch TEXT NOT NULL,
|
|
19
|
+
period_from TEXT NOT NULL,
|
|
20
|
+
period_to TEXT NOT NULL CHECK (period_to >= period_from),
|
|
21
|
+
requested_at TEXT NOT NULL,
|
|
22
|
+
verification_code TEXT NOT NULL,
|
|
23
|
+
page_count BIGINT NOT NULL CHECK (page_count > 0),
|
|
24
|
+
source_file TEXT NOT NULL,
|
|
25
|
+
source_sha256 TEXT NOT NULL,
|
|
26
|
+
first_batch_id TEXT NOT NULL REFERENCES import_batches(id),
|
|
27
|
+
last_batch_id TEXT NOT NULL REFERENCES import_batches(id),
|
|
28
|
+
raw_json TEXT NOT NULL CHECK (vault_json_valid(raw_json))
|
|
29
|
+
);
|
|
30
|
+
|
|
31
|
+
CREATE TABLE "tailong_bank_transactions" (
|
|
32
|
+
transaction_key TEXT PRIMARY KEY,
|
|
33
|
+
account_key TEXT NOT NULL,
|
|
34
|
+
account_masked TEXT NOT NULL,
|
|
35
|
+
card_last_four TEXT NOT NULL CHECK (length(card_last_four) = 4),
|
|
36
|
+
currency TEXT NOT NULL,
|
|
37
|
+
occurred_at TEXT NOT NULL,
|
|
38
|
+
direction TEXT NOT NULL CHECK (direction IN ('in', 'out', 'neutral')),
|
|
39
|
+
amount_cents BIGINT NOT NULL CHECK (amount_cents >= 0),
|
|
40
|
+
balance_cents BIGINT NOT NULL,
|
|
41
|
+
counterparty TEXT NOT NULL,
|
|
42
|
+
counterparty_account TEXT NOT NULL,
|
|
43
|
+
institution TEXT NOT NULL,
|
|
44
|
+
description TEXT NOT NULL,
|
|
45
|
+
bank_txn_id TEXT NOT NULL,
|
|
46
|
+
transaction_card TEXT NOT NULL,
|
|
47
|
+
status TEXT NOT NULL,
|
|
48
|
+
source_file TEXT NOT NULL,
|
|
49
|
+
source_sha256 TEXT NOT NULL,
|
|
50
|
+
source_sheet TEXT NOT NULL,
|
|
51
|
+
row_number BIGINT NOT NULL CHECK (row_number > 0),
|
|
52
|
+
first_batch_id TEXT NOT NULL REFERENCES import_batches(id),
|
|
53
|
+
last_batch_id TEXT NOT NULL REFERENCES import_batches(id),
|
|
54
|
+
raw_json TEXT NOT NULL CHECK (vault_json_valid(raw_json)),
|
|
55
|
+
source_kind TEXT NOT NULL DEFAULT 'tailong_debit_card' CHECK (source_kind = 'tailong_debit_card'),
|
|
56
|
+
date_precision TEXT NOT NULL DEFAULT 'day' CHECK (date_precision = 'day'),
|
|
57
|
+
page_number BIGINT NOT NULL CHECK (page_number > 0),
|
|
58
|
+
statement_key TEXT NOT NULL REFERENCES tailong_bank_statements(statement_key),
|
|
59
|
+
CHECK ((direction = 'neutral' AND amount_cents = 0) OR (direction IN ('in', 'out') AND amount_cents > 0))
|
|
60
|
+
);
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
CREATE INDEX ix_tailong_statement_account_period ON tailong_bank_statements(account_key, period_from, period_to);
|
|
64
|
+
CREATE INDEX ix_tailong_transaction_account_date ON tailong_bank_transactions(account_key, occurred_at);
|
|
65
|
+
CREATE INDEX ix_tailong_transaction_statement ON tailong_bank_transactions(statement_key);
|
|
66
|
+
|
|
67
|
+
-- 新表按原始事实保护,只有 importer/migration 会话可写;每行审计、数据版本和
|
|
68
|
+
-- TRUNCATE 防护与现有银行卡完全一致。增量 SQL 同时用于旧库升级和新库逐步安装。
|
|
69
|
+
DO $$
|
|
70
|
+
DECLARE target_table text; key_column text; grant_row record;
|
|
71
|
+
BEGIN
|
|
72
|
+
FOREACH target_table IN ARRAY ARRAY['tailong_bank_statements', 'tailong_bank_transactions'] LOOP
|
|
73
|
+
key_column := CASE WHEN target_table = 'tailong_bank_statements' THEN 'statement_key' ELSE 'transaction_key' END;
|
|
74
|
+
EXECUTE format('CREATE TRIGGER trg_%s_guard BEFORE INSERT OR UPDATE OR DELETE ON %I FOR EACH ROW EXECUTE FUNCTION vault_guard(''fact'')', target_table, target_table);
|
|
75
|
+
EXECUTE format('CREATE TRIGGER trg_%s_truncate BEFORE TRUNCATE ON %I FOR EACH STATEMENT EXECUTE FUNCTION vault_guard(''fact'')', target_table, target_table);
|
|
76
|
+
EXECUTE format('CREATE TRIGGER trg_%s_version AFTER INSERT OR UPDATE OR DELETE ON %I FOR EACH STATEMENT EXECUTE FUNCTION vault_touch()', target_table, target_table);
|
|
77
|
+
EXECUTE format('CREATE TRIGGER trg_%s_audit AFTER INSERT OR UPDATE OR DELETE ON %I FOR EACH ROW EXECUTE FUNCTION vault_audit(%L)', target_table, target_table, key_column);
|
|
78
|
+
-- 继承同类事实表的现有应用/只读权限,不写死部署角色,也不授予新的管理权限。
|
|
79
|
+
FOR grant_row IN SELECT grantee, privilege_type FROM information_schema.role_table_grants
|
|
80
|
+
WHERE table_schema = 'public' AND role_table_grants.table_name = 'bank_card_transactions'
|
|
81
|
+
AND grantee <> current_user AND privilege_type IN ('SELECT', 'INSERT', 'UPDATE', 'DELETE')
|
|
82
|
+
LOOP
|
|
83
|
+
EXECUTE format('GRANT %s ON TABLE %I TO %s', grant_row.privilege_type, target_table,
|
|
84
|
+
CASE WHEN grant_row.grantee = 'PUBLIC' THEN 'PUBLIC' ELSE quote_ident(grant_row.grantee) END);
|
|
85
|
+
END LOOP;
|
|
86
|
+
END LOOP;
|
|
87
|
+
END $$;
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
-- 建设银行 Excel 活期明细使用专属事实表,既有银行记录、批次和审计不重写。
|
|
2
|
+
-- 只扩展批次来源枚举;时间精度、正负方向、原始九列与原件批次外键明确保存。
|
|
3
|
+
ALTER TABLE import_batches DROP CONSTRAINT import_batches_source_kind_check;
|
|
4
|
+
ALTER TABLE import_batches ADD CONSTRAINT import_batches_source_kind_check CHECK (source_kind IN (
|
|
5
|
+
'wechat_chat', 'audio_db', 'alipay', 'wechatpay', 'jd', 'taobao', 'pdd',
|
|
6
|
+
'meituan', 'taobao_takeout', 'train12306', 'manual_ledger', 'legacy_md',
|
|
7
|
+
'citic_credit_card', 'citic_debit_card', 'cmb_debit_card', 'cmb_credit_card',
|
|
8
|
+
'bocom_debit_card', 'bocom_credit_card', 'psbc_debit_card', 'tailong_debit_card', 'ccb_debit_card'
|
|
9
|
+
));
|
|
10
|
+
|
|
11
|
+
CREATE TABLE "ccb_bank_statements" (
|
|
12
|
+
statement_key TEXT PRIMARY KEY,
|
|
13
|
+
source_kind TEXT NOT NULL CHECK (source_kind = 'ccb_debit_card'),
|
|
14
|
+
account_key TEXT NOT NULL,
|
|
15
|
+
account_masked TEXT NOT NULL,
|
|
16
|
+
owner_name TEXT NOT NULL,
|
|
17
|
+
account_type TEXT NOT NULL,
|
|
18
|
+
branch TEXT NOT NULL,
|
|
19
|
+
period_from TEXT NOT NULL,
|
|
20
|
+
period_to TEXT NOT NULL CHECK (period_to >= period_from),
|
|
21
|
+
requested_at TEXT NOT NULL,
|
|
22
|
+
verification_code TEXT NOT NULL,
|
|
23
|
+
page_count BIGINT CHECK (page_count IS NULL OR page_count > 0),
|
|
24
|
+
source_file TEXT NOT NULL,
|
|
25
|
+
source_sha256 TEXT NOT NULL,
|
|
26
|
+
first_batch_id TEXT NOT NULL REFERENCES import_batches(id),
|
|
27
|
+
last_batch_id TEXT NOT NULL REFERENCES import_batches(id),
|
|
28
|
+
raw_json TEXT NOT NULL CHECK (vault_json_valid(raw_json))
|
|
29
|
+
);
|
|
30
|
+
|
|
31
|
+
CREATE TABLE "ccb_bank_transactions" (
|
|
32
|
+
transaction_key TEXT PRIMARY KEY,
|
|
33
|
+
account_key TEXT NOT NULL,
|
|
34
|
+
account_masked TEXT NOT NULL,
|
|
35
|
+
card_last_four TEXT NOT NULL CHECK (length(card_last_four) = 4),
|
|
36
|
+
currency TEXT NOT NULL,
|
|
37
|
+
occurred_at TEXT NOT NULL,
|
|
38
|
+
direction TEXT NOT NULL CHECK (direction IN ('in', 'out', 'neutral')),
|
|
39
|
+
amount_cents BIGINT NOT NULL CHECK (amount_cents >= 0),
|
|
40
|
+
balance_cents BIGINT NOT NULL,
|
|
41
|
+
counterparty TEXT NOT NULL,
|
|
42
|
+
counterparty_account TEXT NOT NULL,
|
|
43
|
+
institution TEXT NOT NULL,
|
|
44
|
+
description TEXT NOT NULL,
|
|
45
|
+
bank_txn_id TEXT NOT NULL,
|
|
46
|
+
transaction_card TEXT NOT NULL,
|
|
47
|
+
status TEXT NOT NULL,
|
|
48
|
+
source_file TEXT NOT NULL,
|
|
49
|
+
source_sha256 TEXT NOT NULL,
|
|
50
|
+
source_sheet TEXT NOT NULL CHECK (length(source_sheet) > 0),
|
|
51
|
+
row_number BIGINT NOT NULL CHECK (row_number > 0),
|
|
52
|
+
first_batch_id TEXT NOT NULL REFERENCES import_batches(id),
|
|
53
|
+
last_batch_id TEXT NOT NULL REFERENCES import_batches(id),
|
|
54
|
+
raw_json TEXT NOT NULL CHECK (vault_json_valid(raw_json)),
|
|
55
|
+
source_kind TEXT NOT NULL DEFAULT 'ccb_debit_card' CHECK (source_kind = 'ccb_debit_card'),
|
|
56
|
+
date_precision TEXT NOT NULL DEFAULT 'day' CHECK (date_precision = 'day'),
|
|
57
|
+
page_number BIGINT CHECK (page_number IS NULL),
|
|
58
|
+
statement_key TEXT NOT NULL REFERENCES ccb_bank_statements(statement_key),
|
|
59
|
+
CHECK ((direction = 'neutral' AND amount_cents = 0) OR (direction IN ('in', 'out') AND amount_cents > 0))
|
|
60
|
+
);
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
CREATE INDEX ix_ccb_statement_account_period ON ccb_bank_statements(account_key, period_from, period_to);
|
|
64
|
+
CREATE INDEX ix_ccb_transaction_account_date ON ccb_bank_transactions(account_key, occurred_at);
|
|
65
|
+
CREATE INDEX ix_ccb_transaction_statement ON ccb_bank_transactions(statement_key);
|
|
66
|
+
|
|
67
|
+
-- 新表按原始事实保护,只有 importer/migration 会话可写;每行审计、数据版本和
|
|
68
|
+
-- TRUNCATE 防护与现有银行卡完全一致。增量 SQL 同时用于旧库升级和新库逐步安装。
|
|
69
|
+
DO $$
|
|
70
|
+
DECLARE target_table text; key_column text; grant_row record;
|
|
71
|
+
BEGIN
|
|
72
|
+
FOREACH target_table IN ARRAY ARRAY['ccb_bank_statements', 'ccb_bank_transactions'] LOOP
|
|
73
|
+
key_column := CASE WHEN target_table = 'ccb_bank_statements' THEN 'statement_key' ELSE 'transaction_key' END;
|
|
74
|
+
EXECUTE format('CREATE TRIGGER trg_%s_guard BEFORE INSERT OR UPDATE OR DELETE ON %I FOR EACH ROW EXECUTE FUNCTION vault_guard(''fact'')', target_table, target_table);
|
|
75
|
+
EXECUTE format('CREATE TRIGGER trg_%s_truncate BEFORE TRUNCATE ON %I FOR EACH STATEMENT EXECUTE FUNCTION vault_guard(''fact'')', target_table, target_table);
|
|
76
|
+
EXECUTE format('CREATE TRIGGER trg_%s_version AFTER INSERT OR UPDATE OR DELETE ON %I FOR EACH STATEMENT EXECUTE FUNCTION vault_touch()', target_table, target_table);
|
|
77
|
+
EXECUTE format('CREATE TRIGGER trg_%s_audit AFTER INSERT OR UPDATE OR DELETE ON %I FOR EACH ROW EXECUTE FUNCTION vault_audit(%L)', target_table, target_table, key_column);
|
|
78
|
+
-- 继承同类事实表的现有应用/只读权限,不写死部署角色,也不授予新的管理权限。
|
|
79
|
+
FOR grant_row IN SELECT grantee, privilege_type FROM information_schema.role_table_grants
|
|
80
|
+
WHERE table_schema = 'public' AND role_table_grants.table_name = 'bank_card_transactions'
|
|
81
|
+
AND grantee <> current_user AND privilege_type IN ('SELECT', 'INSERT', 'UPDATE', 'DELETE')
|
|
82
|
+
LOOP
|
|
83
|
+
EXECUTE format('GRANT %s ON TABLE %I TO %s', grant_row.privilege_type, target_table,
|
|
84
|
+
CASE WHEN grant_row.grantee = 'PUBLIC' THEN 'PUBLIC' ELSE quote_ident(grant_row.grantee) END);
|
|
85
|
+
END LOOP;
|
|
86
|
+
END LOOP;
|
|
87
|
+
END $$;
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
-- 建设银行信用卡交易汇总使用专属事实表,既有银行记录、批次和审计不重写。
|
|
2
|
+
-- 只扩展批次来源枚举;时间精度、正负方向、原始十五列与原件批次外键明确保存。
|
|
3
|
+
ALTER TABLE import_batches DROP CONSTRAINT import_batches_source_kind_check;
|
|
4
|
+
ALTER TABLE import_batches ADD CONSTRAINT import_batches_source_kind_check CHECK (source_kind IN (
|
|
5
|
+
'wechat_chat', 'audio_db', 'alipay', 'wechatpay', 'jd', 'taobao', 'pdd',
|
|
6
|
+
'meituan', 'taobao_takeout', 'train12306', 'manual_ledger', 'legacy_md',
|
|
7
|
+
'citic_credit_card', 'citic_debit_card', 'cmb_debit_card', 'cmb_credit_card',
|
|
8
|
+
'bocom_debit_card', 'bocom_credit_card', 'psbc_debit_card', 'tailong_debit_card', 'ccb_debit_card', 'ccb_credit_card'
|
|
9
|
+
));
|
|
10
|
+
|
|
11
|
+
CREATE TABLE "ccb_credit_card_transactions" (
|
|
12
|
+
transaction_key TEXT PRIMARY KEY,
|
|
13
|
+
statement_key TEXT CHECK (statement_key IS NULL),
|
|
14
|
+
transaction_date TEXT NOT NULL,
|
|
15
|
+
posting_date TEXT NOT NULL,
|
|
16
|
+
card_last_four TEXT NOT NULL CHECK (length(card_last_four) = 4),
|
|
17
|
+
description TEXT NOT NULL,
|
|
18
|
+
transaction_currency TEXT,
|
|
19
|
+
transaction_amount_cents BIGINT NOT NULL,
|
|
20
|
+
settlement_currency TEXT NOT NULL,
|
|
21
|
+
settlement_amount_cents BIGINT NOT NULL,
|
|
22
|
+
transaction_kind TEXT NOT NULL CHECK (transaction_kind IN ('charge', 'fee', 'refund', 'repayment', 'credit')),
|
|
23
|
+
occurrence BIGINT NOT NULL CHECK (occurrence > 0),
|
|
24
|
+
page_number BIGINT CHECK (page_number IS NULL),
|
|
25
|
+
end_page_number BIGINT CHECK (end_page_number IS NULL),
|
|
26
|
+
source_file TEXT NOT NULL,
|
|
27
|
+
source_sha256 TEXT NOT NULL,
|
|
28
|
+
first_batch_id TEXT NOT NULL REFERENCES import_batches(id),
|
|
29
|
+
last_batch_id TEXT NOT NULL REFERENCES import_batches(id),
|
|
30
|
+
raw_json TEXT NOT NULL CHECK (vault_json_valid(raw_json)),
|
|
31
|
+
original_amount_raw TEXT NOT NULL DEFAULT '',
|
|
32
|
+
source_kind TEXT NOT NULL CHECK (source_kind='ccb_credit_card'),
|
|
33
|
+
card_key TEXT NOT NULL,
|
|
34
|
+
account_masked TEXT NOT NULL,
|
|
35
|
+
occurred_at TEXT NOT NULL,
|
|
36
|
+
date_precision TEXT NOT NULL CHECK (date_precision IN ('day','second')),
|
|
37
|
+
transaction_time_raw TEXT NOT NULL,
|
|
38
|
+
bank_type TEXT NOT NULL,
|
|
39
|
+
direction TEXT NOT NULL CHECK (direction IN ('in','out')),
|
|
40
|
+
payment_channel TEXT NOT NULL,
|
|
41
|
+
counterparty TEXT NOT NULL,
|
|
42
|
+
remark TEXT NOT NULL,
|
|
43
|
+
source_sheet TEXT NOT NULL,
|
|
44
|
+
row_number BIGINT NOT NULL CHECK (row_number>0),
|
|
45
|
+
original_sequence BIGINT NOT NULL CHECK (original_sequence>0),
|
|
46
|
+
CHECK (transaction_currency='CNY' AND settlement_currency='CNY'),
|
|
47
|
+
CHECK (transaction_amount_cents=settlement_amount_cents),
|
|
48
|
+
CHECK ((direction='out' AND transaction_kind IN ('charge','fee') AND settlement_amount_cents>0) OR (direction='in' AND transaction_kind IN ('refund','credit') AND settlement_amount_cents<0))
|
|
49
|
+
);
|
|
50
|
+
|
|
51
|
+
CREATE INDEX ix_ccb_credit_card_date ON ccb_credit_card_transactions(card_key,transaction_date);
|
|
52
|
+
CREATE INDEX ix_ccb_credit_source ON ccb_credit_card_transactions(source_sha256,row_number);
|
|
53
|
+
|
|
54
|
+
-- 独立交易事实沿用现有导入会话、逐行审计与数据版本保护,不伪造月度账单。
|
|
55
|
+
CREATE TRIGGER trg_ccb_credit_card_transactions_guard BEFORE INSERT OR UPDATE OR DELETE ON ccb_credit_card_transactions FOR EACH ROW EXECUTE FUNCTION vault_guard('fact');
|
|
56
|
+
CREATE TRIGGER trg_ccb_credit_card_transactions_truncate BEFORE TRUNCATE ON ccb_credit_card_transactions FOR EACH STATEMENT EXECUTE FUNCTION vault_guard('fact');
|
|
57
|
+
CREATE TRIGGER trg_ccb_credit_card_transactions_version AFTER INSERT OR UPDATE OR DELETE ON ccb_credit_card_transactions FOR EACH STATEMENT EXECUTE FUNCTION vault_touch();
|
|
58
|
+
CREATE TRIGGER trg_ccb_credit_card_transactions_audit AFTER INSERT OR UPDATE OR DELETE ON ccb_credit_card_transactions FOR EACH ROW EXECUTE FUNCTION vault_audit('transaction_key');
|
|
59
|
+
DO $$ DECLARE grant_row record; BEGIN
|
|
60
|
+
FOR grant_row IN SELECT grantee,privilege_type FROM information_schema.role_table_grants
|
|
61
|
+
WHERE table_schema='public' AND table_name='credit_card_transactions' AND grantee<>current_user AND privilege_type IN ('SELECT','INSERT','UPDATE','DELETE')
|
|
62
|
+
LOOP EXECUTE format('GRANT %s ON TABLE ccb_credit_card_transactions TO %s',grant_row.privilege_type,CASE WHEN grant_row.grantee='PUBLIC' THEN 'PUBLIC' ELSE quote_ident(grant_row.grantee) END); END LOOP;
|
|
63
|
+
END $$;
|