On Thu, Nov 01, 2018 at 12:27:23PM -0300, Alvaro Herrera wrote:
> Ah, now this is interesting. Can you please supply the definition of
> the table?
Attached.
> I'm wondering if there is a partitioned table with an FK to
> this one.
There is. Both ref.auto_hint and clin.suppressed_hint are
using inheritance (from audit.audit_fields). However, GNUmed
does not use inheritance for explicit partitioning but rather
similar to how classes and subclasses are used in OO languages.
> I'm not quite seeing how come 'tup' is NULL there. Can you
> 'print trigdata' in frame 2?
Sure, how ? :-)
(I can surely type "print trigdata" but does that already
auto-select from "frame 2" ?)
Karsten
--
GPG 40BE 5B0E C98E 1713 AFA6 5BC0 3BEA AC80 7D4F C89B
Ausgabeformat ist »wrapped«.
Tabelle »audit.audit_fields«
Spalte | Typ | Sortierfolge | NULL erlaubt? |
Vorgabewert | Speicherung | Statistikziel |
Beschreibung
---------------+--------------------------+--------------+---------------+------------------------------------------------------+-------------+---------------+--------------------------------------------------------
pk_audit | integer | | not null |
nextval('audit.audit_fields_pk_audit_seq'::regclass) | plain |
|
row_version | integer | | not null | 0
| plain | |
the version of the row; mainly just a count
modified_when | timestamp with time zone | | not null |
CURRENT_TIMESTAMP | plain |
| when has this row been committed (created/modified)
modified_by | name | | not null |
CURRENT_USER | plain |
| by whom has this row been committed (created/modified)
Indexe:
"audit_fields_pkey" PRIMARY KEY, btree (pk_audit)
Check-Constraints:
"audit_audit_fields_sane_modified_when" CHECK ((modified_when <=
clock_timestamp()) IS TRUE)
Regeln:
audit_fields_no_del AS
ON DELETE TO audit.audit_fields DO INSTEAD NOTHING
audit_fields_no_ins AS
ON INSERT TO audit.audit_fields DO INSTEAD NOTHING
audit_fields_no_upd AS
ON UPDATE TO audit.audit_fields DO INSTEAD NOTHING
Kindtabellen: bill.bill,
bill.bill_item,
blobs.doc_desc,
blobs.doc_med,
blobs.lnk_doc2hospital_stay,
blobs.lnk_doc_med2episode,
cfg.report_query,
clin.allergy_state,
clin.clin_diag,
clin.clin_item_type,
clin.clin_root_item,
clin.encounter,
clin.episode,
clin.external_care,
clin.fhx_relation_type,
clin.form_data,
clin.health_issue,
clin.incoming_data_unmatchable,
clin.incoming_data_unmatched,
clin.lnk_code2item_root,
clin.lnk_constraint2vacc_course,
clin.lnk_pat2vaccination_course,
clin.lnk_substance2episode,
clin.lnk_tst2norm,
clin.lnk_type2item,
clin.lnk_vaccination_course2schedule,
clin.lnk_vaccine2inds,
clin.patient,
clin.review_root,
clin.suppressed_hint,
clin.test_org,
clin.test_panel,
clin.test_type,
clin.vaccination_course,
clin.vaccination_course_constraint,
clin.vaccination_definition,
clin.vaccination_schedule,
clin.vacc_indication,
clin.vaccine,
clin.vaccine_batches,
clin.vacc_route,
clin.waiting_list,
de_de.beh_fall_typ,
de_de.lab_test_gnr,
de_de.prax_geb_paid,
dem.address,
dem.gender_label,
dem.identity,
dem.identity_tag,
dem.inbox_item_category,
dem.inbox_item_type,
dem.lnk_identity2ext_id,
dem.lnk_job2person,
dem.lnk_org_unit2comm,
dem.lnk_org_unit2ext_id,
dem.lnk_person2relative,
dem.message_inbox,
dem.occupation,
dem.org,
dem.org_unit,
dem.praxis_branch,
dem.region,
dem.relation_types,
dem.staff,
dem.street,
dem.urb,
gm.access_log,
ref.auto_hint,
ref.branded_drug,
ref.consumable_substance,
ref.data_source,
ref.lnk_substance2brand,
ref.paperwork_templates,
ref.tag_image
Ausgabeformat ist »wrapped«.
Tabelle »ref.auto_hint«
Spalte | Typ | Sortierfolge | NULL erlaubt?
| Vorgabewert | Speicherung |
Statistikziel | Beschreibung
----------------------+--------------------------+--------------+---------------+------------------------------------------------------+-------------+---------------+------------------------------------------------------------------------
pk_audit | integer | | not null
| nextval('audit.audit_fields_pk_audit_seq'::regclass) | plain |
|
row_version | integer | | not null
| 0 | plain |
|
modified_when | timestamp with time zone | | not null
| CURRENT_TIMESTAMP | plain |
|
modified_by | name | | not null
| CURRENT_USER | plain |
|
pk | integer | | not null
| nextval('ref.auto_hint_pk_seq'::regclass) | plain |
|
query | text | |
| | extended |
| This query is run against the database.
title | text | |
| | extended |
| A short title to summarize and identify the hint.
hint | text | |
| | extended |
| When the query returns true this is the hint that should be displayed.
url | text | |
| | extended |
| An URL relevant to the hint.
is_active | boolean | | not null
| true | plain |
| Whether or not this query/hint is active.
source | text | |
| | extended |
| Who provided query and hint.
lang | text | |
| | extended |
| The language the hint is written in.
recommendation_query | text | |
| | extended |
|
Indexe:
"auto_hint_pkey" PRIMARY KEY, btree (pk)
"ref_auto_hint_uniq_query" UNIQUE CONSTRAINT, btree (query)
"ref_auto_hint_uniq_title" UNIQUE CONSTRAINT, btree (title)
Check-Constraints:
"audit_audit_fields_sane_modified_when" CHECK ((modified_when <=
clock_timestamp()) IS TRUE)
"ref_auto_hint_sane_hint" CHECK (gm.is_null_or_blank_string(hint) IS FALSE)
"ref_auto_hint_sane_lang" CHECK (gm.is_null_or_blank_string(lang) IS FALSE)
"ref_auto_hint_sane_query" CHECK (gm.is_null_or_blank_string(query) IS
FALSE)
"ref_auto_hint_sane_rec_query" CHECK
(gm.is_null_or_non_empty_string(recommendation_query))
"ref_auto_hint_sane_source" CHECK (gm.is_null_or_blank_string(source) IS
FALSE)
"ref_auto_hint_sane_title" CHECK (gm.is_null_or_blank_string(title) IS
FALSE)
"ref_auto_hint_sane_url" CHECK (gm.is_null_or_non_empty_string(url))
Fremdschlüsselverweise von:
TABLE "clin.suppressed_hint" CONSTRAINT "fk_clin_suppressed_hint_fk_hint"
FOREIGN KEY (fk_hint) REFERENCES ref.auto_hint(pk) ON UPDATE RESTRICT ON DELETE
CASCADE
Trigger:
zt_del_auto_hint BEFORE DELETE ON ref.auto_hint FOR EACH ROW EXECUTE
PROCEDURE audit.ft_del_auto_hint()
zt_ins_auto_hint BEFORE INSERT ON ref.auto_hint FOR EACH ROW EXECUTE
PROCEDURE audit.ft_ins_auto_hint()
zt_upd_auto_hint BEFORE UPDATE ON ref.auto_hint FOR EACH ROW EXECUTE
PROCEDURE audit.ft_upd_auto_hint()
Erbt von: audit.audit_fields
Ausgabeformat ist »wrapped«.
Tabelle »clin.suppressed_hint«
Spalte | Typ | Sortierfolge | NULL erlaubt? |
Vorgabewert | Speicherung | Statistikziel
| Beschreibung
-----------------+--------------------------+--------------+---------------+------------------------------------------------------+-------------+---------------+-----------------------------------------------------------
pk_audit | integer | | not null |
nextval('audit.audit_fields_pk_audit_seq'::regclass) | plain |
|
row_version | integer | | not null | 0
| plain |
|
modified_when | timestamp with time zone | | not null |
CURRENT_TIMESTAMP | plain |
|
modified_by | name | | not null |
CURRENT_USER | plain |
|
pk | integer | | not null |
nextval('clin.suppressed_hint_pk_seq'::regclass) | plain |
|
fk_encounter | integer | | not null |
| plain |
| the encounter during which this hint was first suppressed
fk_hint | integer | | not null |
| plain |
| the hint that is suppressed
suppressed_by | name | | not null |
CURRENT_USER | plain |
| who suppressed this hint
suppressed_when | timestamp with time zone | | not null |
statement_timestamp() | plain |
| when was this hint suppressed
rationale | text | | |
| extended |
| rationale on why this hint is suppressed in this patient
md5_sum | text | | |
| extended |
| md5 of relevant fields of this hint
Indexe:
"suppressed_hint_pkey" PRIMARY KEY, btree (pk)
"idx_suppressed_hint_fk_encounter" btree (fk_encounter)
"idx_suppressed_hint_fk_hint" btree (fk_hint)
Check-Constraints:
"audit_audit_fields_sane_modified_when" CHECK ((modified_when <=
clock_timestamp()) IS TRUE)
"clin_suppressed_hint_sane_by" CHECK (length(suppressed_by::text) > 0)
"clin_suppressed_hint_sane_md5" CHECK (gm.is_null_or_blank_string(md5_sum)
IS FALSE)
"clin_suppressed_hint_sane_rationale" CHECK
(gm.is_null_or_blank_string(rationale) IS FALSE)
Fremdschlüssel-Constraints:
"fk_clin_suppressed_hint_fk_encounter" FOREIGN KEY (fk_encounter)
REFERENCES clin.encounter(pk) ON UPDATE RESTRICT ON DELETE RESTRICT
"fk_clin_suppressed_hint_fk_hint" FOREIGN KEY (fk_hint) REFERENCES
ref.auto_hint(pk) ON UPDATE RESTRICT ON DELETE CASCADE
Trigger:
tr_sanity_check_uniq_hint_per_pat_ins_upd AFTER INSERT OR UPDATE ON
clin.suppressed_hint DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE
PROCEDURE clin.trf_sanity_check_uniq_hint_per_pat_ins_upd()
zt_del_suppressed_hint BEFORE DELETE ON clin.suppressed_hint FOR EACH ROW
EXECUTE PROCEDURE audit.ft_del_suppressed_hint()
zt_ins_suppressed_hint BEFORE INSERT ON clin.suppressed_hint FOR EACH ROW
EXECUTE PROCEDURE audit.ft_ins_suppressed_hint()
zt_upd_suppressed_hint BEFORE UPDATE ON clin.suppressed_hint FOR EACH ROW
EXECUTE PROCEDURE audit.ft_upd_suppressed_hint()
zzz_tr_announce_clin_suppressed_hint_del AFTER DELETE ON
clin.suppressed_hint DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE
PROCEDURE
gm.trf_announce_table_del('operation=DELETE::table=clin.suppressed_hint::PK
name=pk', 'select $1.pk', 'select fk_patient from clin.encounter where pk =
$1.fk_encounter limit 1')
zzz_tr_announce_clin_suppressed_hint_ins_upd AFTER INSERT OR UPDATE ON
clin.suppressed_hint DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE
PROCEDURE gm.trf_announce_table_ins_upd('table=clin.suppressed_hint::PK
name=pk', 'select $1.pk', 'select fk_patient from clin.encounter where pk =
$1.fk_encounter limit 1')
Erbt von: audit.audit_fields