10i — Company Triggers (OW* Series)

Ownership, address, contact, document, and relationship trigger business rules

Company Trigger Architecture

Domain boundary: All OW* triggers operate on the owner/company domain, distinct from the vessel (HI*/ST*/LR*) domain.

Key architectural differences from vessel triggers:
  • tblChanges — OW* triggers write old/new value pairs into tblChanges for detailed field-level audit; vessel triggers use tblAnnotationLogGeneral
  • spGetUserSettingsOwners — company-domain variant of spGetUserSettings, used by all OW* triggers that need annotation context
  • Delete triggers without guards — OWGE_Delete, OWCN_Delete, OWCO_Delete, OWSH_Delete, OWXR_Delete all omit the IF NOT EXISTS (SELECT * FROM TRIGGER_DISABLE) guard; deletes always fire
  • OWIN — INSTEAD OF + dual guard — OWIN_Update is an INSTEAD OF INSERT,UPDATE trigger; it checks both TRIGGER_DISABLE_OWIN and TRIGGER_DISABLE before proceeding
  • EDM Dec 2025 — OWGE and OWXR now reference vwABSD_OWXR_EDM (EDM-sourced ownership view) instead of ABSD_OWXR directly for NATY2 cascade and vessel ownership checks
  • EDM Feb 2026 — OWAD1 COUNTRY, TOWN, and STREET foreign-key constraint checks are commented out because codebooks migrated to EDM and were not backfilled to ABSD_

Staging tables pattern: Every OW* table has a corresponding *_UPDATES / *_DELETES staging table that downstream processes (APS, Shipwatch, EDM feeds) consume.

OWGE — General Owner / Company Header

ABSD_OWGE_Update

FOR UPDATE, INSERT
Table
dbo.ABSD_OWGE
Guard
TRIGGER_DISABLE (standard)
Cursor
Yes — per-OWCODE loop
Staging
OWGE_UPDATES
Validation Cascade tblChanges Staging EDM Dec 2025
OWGE is the most complex company trigger. It validates the company header record, enforces enumerated field values, cascades nationality changes to related ownership records, and maintains the fleet-count summary table (OWST).

GROUP_OWGE Enumeration Rule

  • GROUP_OWGE must be one of: A (Actual), B (Beneficial), D (Disponent), G (Group), I (ISM), M (Manager), O (Operator), P (Parent), R (Registered), S (Ship Manager), T (Technical), X (Address) — or NULL
  • Any other value raises an error and rolls back: "GROUP_OWGE must be one of..."

TITLE1 Enumeration Rule

  • TITLE1 (salutation) must be NULL or one of: Mr, Mrs, Ms, Miss, Dr, Prof, Capt, Rev, Sir, Lady, Lord
  • Any other value raises: "TITLE1 must be one of the defined salutation types or NULL"

In-Service Vessel Check

  • A company record cannot be deleted (via update-to-deleted state) if it has vessels currently in service
  • Checks via vwABSD_OWXR_EDM (EDM Dec 2025) rather than ABSD_OWXR directly
  • If active vessel relationships exist, the operation is blocked with an explanatory error

MR_IND_1 to MR_IND_4 Validation

  • Each MR_IND_n field (Maritec Reference indicators) must be Y, N, or NULL
  • All four fields validated independently; any invalid value raises error and rolls back

NATY2 Cascade

  • When NATY2 (nationality) changes, the trigger cascades the new nationality to all ownership relationship records for this company
  • Uses vwABSD_OWXR_EDM (EDM Dec 2025) to identify related records
  • Updates ABSD_OWXR.NATY2 for all matching OWCODE rows

Relationship Validation (valOwnerRelationship / valOwnerRelationshipAny)

  • valOwnerRelationship — validates that the owner relationship type is valid for the specific context
  • valOwnerRelationshipAny — validates relationship type against the full permitted set
  • Both validators are called via stored procedure and return error messages on failure

OWST Fleet-Count Rebuild

  • After any update to OWGE, the trigger calls the OWST rebuild logic for this OWCODE
  • OWST stores pre-computed fleet counts (IRP/RP/P buckets) consumed by reporting and external feeds
  • See OWST trigger for the 5-part rebuild algorithm

Staging and Audit

  • Inserts current record into OWGE_UPDATES (replace-if-exists pattern)
  • Writes tblChanges entries for changed fields with old and new values
  • Uses spGetUserSettingsOwners to get initiating user context

OWGE_Delete

FOR DELETE NO TRIGGER_DISABLE GUARD
This DELETE trigger has no IF NOT EXISTS (SELECT * FROM TRIGGER_DISABLE) guard. Deletes always fire the trigger regardless of the disable flag state.
  • Captures deleted OWCODE to OWNDEL_UPDATES staging table for downstream processing
  • No validation — deletion is unconditional once past any referential-integrity constraints at the database level

OWNA — Owner Name Record

ABSD_OWNA_Update

FOR UPDATE, INSERT
Table
dbo.ABSD_OWNA
Guard
TRIGGER_DISABLE (standard)
Cursor
Yes — per-OWCODE loop
Downstream
OWIN, ABSD_PERSONNEL, OWNER_SEARCH
Validation Cascade → OWIN, PERSONNEL, OWNER_SEARCH Staging

Name Format Validation

  • Name fields must not contain leading or trailing spaces
  • Certain special-character patterns are rejected (implementation uses pattern matching)
  • Short-name (abbreviated) field length constraints enforced

Best Address 7-Step Fallback Algorithm

OWNA_Update resolves the best address record for this OWCODE to propagate into ABSD_OWIN. The fallback priority order is:

  • Step 1: Look for an OWAD1 record with ADDTYPE='H' (head office) and SEQNOA='00'
  • Step 2: Any ADDTYPE='H' record (any SEQNOA)
  • Step 3: ADDTYPE='B' (branch), SEQNOA='00'
  • Step 4: Any ADDTYPE='B' record
  • Step 5: ADDTYPE='M' (mailing), SEQNOA='00'
  • Step 6: Any ADDTYPE='M' record
  • Step 7: Any address record for this OWCODE (last resort)
The resolved address ADDTYPE+SEQNOA is written into ABSD_OWIN fields ADDTYP and SEQNOAD. This keeps the published internet record pointing to the most appropriate address even when OWNA itself changes.

Downstream Cascades

  • OWIN cascade: Updates ABSD_OWIN with the resolved best-address pointers and the updated name fields
  • ABSD_PERSONNEL update: Writes full formatted name (combining FNAME, MNAME, LNAME) to ABSD_PERSONNEL.FULL_NAME where OWCODE matches
  • OWNER_SEARCH update: Refreshes ABSD_OWNER_SEARCH index record with the new name for search performance

Staging

  • Inserts/replaces into OWNA_UPDATES staging table

OWAD1 — Owner Address (Primary)

ABSD_OWAD1_Update

FOR UPDATE, INSERT
Table
dbo.ABSD_OWAD1
Guard
TRIGGER_DISABLE (standard)
Cursor
Yes — per-OWCODE+ADDTYPE+SEQNOA loop
Validation tblChanges Staging EDM Feb 2026
🟢
EDM Feb 2026 (MW): The COUNTRY, TOWN, and STREET foreign-key validation checks are commented out. These codebook tables migrated to EDM and were not backfilled into ABSD_, making FK checks impossible. The check code is preserved in comments for reference.

ADDTYPE Validation

  • ADDTYPE must be one of: H (Head Office), B (Branch), M (Mailing), R (Registered), T (Trading) — or NULL
  • Invalid ADDTYPE raises error and rolls back

SEQNOA Format Rule

  • SEQNOA must be a two-digit zero-padded sequence: '00', '01', …, '99'
  • Non-numeric or non-two-character values are rejected

CON_IND (Contact Indicator) Rule

  • CON_IND must be Y, N, or NULL
  • When set to Y, marks this address as the primary contact address for the owner

COCODE Format Rules

  • When COCODE (correspondence code) is supplied it must be a valid existing OWCODE in ABSD_OWGE
  • Self-referential COCODE (pointing to own OWCODE) is not permitted
  • If COCODE is provided, spCreateCORelationship is called to register the correspondence relationship

RFB / POBOX / STREETNO Format Rules

  • RFB (Registered For Business), POBOX (P.O. Box number), and STREETNO have maximum length constraints enforced
  • STREETNO must be numeric if supplied
  • POBOX and STREETNO are mutually exclusive on the same address record — having both raises an error

Postcode Validation

  • When POSTCODE is supplied and the address has a recognised country code, the trigger looks up tblPostcodeValidation for a regex pattern matching that country
  • If a pattern exists and the postcode does not match, an error is raised: "Postcode [value] does not match the expected format for country [code]"
  • Countries without a pattern in tblPostcodeValidation are accepted without postcode format checking

FK Checks — COUNTRY / TOWN / STREET (Disabled)

  • Previously validated that COUNTRY, TOWN, and STREET existed in their respective ABSD_ codebook tables
  • Disabled Feb 2026 — codebooks moved to EDM; checks left as comments in trigger body

tblChanges Audit

  • For each changed field, writes a row to tblChanges with: OWCODE, field name, old value, new value, user, date
  • Address fields tracked: ADDTYPE, STREETNO, STREET, TOWN, COUNTRY, POSTCODE, POBOX, RFB, CON_IND, COCODE

ABSD_OWAD1_Delete

FOR DELETE
Guard
TRIGGER_DISABLE (standard)
Cursor
Yes — per-OWCODE+ADDTYPE+SEQNOA
  • If the deleted record had a COCODE, calls spDeleteCORelationship to remove the correspondence relationship
  • Writes a consolidated "Address deleted: [full formatted address string]" entry to tblChanges

OWAD2 — Owner Address (Secondary / Extra)

ABSD_OWAD2_Update

FOR UPDATE, INSERT
Table
dbo.ABSD_OWAD2
Guard
TRIGGER_DISABLE (standard)
Staging Cascade → OWIN LSTCHNGE
  • Updates ABSD_OWIN.LSTCHNGE (last-changed timestamp) for the matching OWCODE — keeps the internet record freshness date current whenever a secondary address changes
  • Inserts into OWAD2_UPDATES staging table (replace-if-exists by OWCODE+ADDTYPE+SEQNOA key)
  • No field-level validation beyond database constraints

OWAN — Owner Alternative Name

OWAN_Update

FOR UPDATE, INSERT
Table
dbo.ABSD_OWAN
Guard
TRIGGER_DISABLE (standard)
Staging
  • Inserts the inserted row directly into OWAN_UPDATES staging table
  • No field-level validation — alternative names are free-form

OWCA — Owner Casualty Record

ABSD_OWCA_Update

FOR UPDATE, INSERT
Table
dbo.ABSD_OWCA
Guard
TRIGGER_DISABLE (standard)
Key
OWCODE + SHLRNO + INNO
Staging
  • Inserts/replaces into OWCA_UPDATES staging table, keyed by OWCODE + SHLRNO + INNO
  • Links company records to their associated casualty incidents (incident number INNO, ship LRNO)
  • No field-level validation — casualty linkage is controlled by the casualty domain triggers (CAGE1 etc.)

OWCN — Owner Contact Note

OWCN_UPDATE

FOR UPDATE, INSERT NO TRIGGER_DISABLE GUARD
Table
dbo.ABSD_OWCN
Guard
NONE — always fires
Cursor
Yes — per-OWCODE loop
tblChanges Annotation (updates only)
OWCN_UPDATE has no TRIGGER_DISABLE guard. The trigger fires on every insert/update regardless of the disable flag. This is unusual for an update trigger in this schema.
  • For TEXT_GRP changes, writes an entry to tblChanges with old/new text group values
  • On UPDATE (not INSERT), also fires secondary annotation logic to log the contact note change via the annotation system
  • No field-level validation — contact notes are free-form text

OWCN_DELETE

FOR DELETE NO TRIGGER_DISABLE GUARD
No TRIGGER_DISABLE guard — fires unconditionally on all deletes.
  • Writes "Note deleted" to tblChanges with the deleted note's OWCODE and TEXT_GRP for audit trail

OWCO — Owner Contact (Phone/Telex/Fax/Cable)

ABSD_OWCO_Update

FOR UPDATE, INSERT
Table
dbo.ABSD_OWCO
Guard
TRIGGER_DISABLE (standard)
Validation Cascade → OWAD1 comms fields tblChanges Staging

TYPE Validation

  • TYPE must be one of: T (Telephone), X (Telex), F (Fax), C (Cable), E (Email), W (Web/URL)
  • Invalid TYPE raises error and rolls back

CNUM Format Rules by TYPE

  • TYPE='T' (Phone): CNUM may contain digits, spaces, hyphens, parentheses, and leading +
  • TYPE='X' (Telex): CNUM must be numeric
  • TYPE='F' (Fax): same rules as telephone
  • TYPE='E' (Email): must contain @ and a dot after the @
  • TYPE='W' (Web): must begin with http:// or https:// or www.
  • Violations raise type-specific error messages and roll back

OWAD1 Bidirectional Sync

  • When a phone/telex/fax/cable OWCO record is inserted or updated, the corresponding field in the matching ABSD_OWAD1 record (head office, ADDTYPE='H', SEQNOA='00') is updated to mirror the value
  • This keeps ABSD_OWAD1 contact fields in sync with the OWCO master contact list
  • Mapping: TYPE='T'OWAD1.PHONE; TYPE='X'OWAD1.TELEX; TYPE='F'OWAD1.FAX; TYPE='C'OWAD1.CABLE

Staging and Audit

  • Inserts/replaces into OWCO_UPDATES staging table
  • Writes tblChanges entry for the CNUM field with old and new values

OWCODelete

FOR DELETE NO TRIGGER_DISABLE GUARD
No TRIGGER_DISABLE guard — fires unconditionally.

OWAD1 Null-Out on Last Delete

  • When an OWCO record is deleted, checks if this was the last contact record of that TYPE for this OWCODE
  • If yes (no more records of this TYPE remain), nulls the corresponding field in ABSD_OWAD1 (e.g., last phone deleted → OWAD1.PHONE = NULL)
  • If other records of the same TYPE remain, no OWAD1 update — the remaining records' values are left as-is

Audit

  • Writes a consolidated "Contact deleted: [TYPE] [CNUM]" entry to tblChanges

OWDC — Owner Document

ABSD_OWDC_Update

FOR UPDATE, INSERT
Table
dbo.ABSD_OWDC
Guard
TRIGGER_DISABLE (standard)
Cursor
Yes — per-OWCODE+HSEQNO loop
tblChanges

Current Document Rule

  • HSEQNO='00' designates the current (most recent) document record for this document type
  • Only one SEQNO='00' record is permitted per OWCODE+document type combination

tblChanges Audit

  • For each changed document field, writes a row to tblChanges with OWCODE, field name, old value, new value, user, date
  • Fields tracked include document reference, issue date, expiry date, issuing authority

ABSD_OWDC_DELETE

FOR DELETE
Guard
TRIGGER_DISABLE (standard)
Cursor
Yes
  • For each deleted document, writes "DOC Deleted" to tblChanges with the document reference fields captured from deleted

OWIN — Owner Internet Record

OWIN_Update

INSTEAD OF INSERT, UPDATE DUAL GUARD
Table
dbo.ABSD_OWIN
Guard
TRIGGER_DISABLE_OWIN + TRIGGER_DISABLE
Validation Staging UTIL_OWIN_UPDATE audit log
🔴
INSTEAD OF trigger — full replace pattern. This trigger does NOT pass the change through normally. It captures the incoming values from inserted, validates them, then executes an explicit DELETE + INSERT on ABSD_OWIN. This means standard INSERT/UPDATE paths never write directly to the table.
Dual guard: The trigger checks both TRIGGER_DISABLE_OWIN and TRIGGER_DISABLE. Either table having a row disables the full INSTEAD OF logic. When both guards are absent, the full validation + replace executes.

ADDTYP / SEQNOA Validation

  • ADDTYP must match an existing OWAD1.ADDTYPE for this OWCODE
  • SEQNOAD must match an existing OWAD1.SEQNOA for the given ADDTYP+OWCODE
  • Stale pointer (pointing to a deleted address) is rejected

SEQNOD Validation

  • SEQNOD (document sequence) must reference a valid OWDC record for this OWCODE when supplied

PUBIND / CONIND Rules

  • PUBIND (publication indicator) must be Y, N, or NULL
  • CONIND (confidential indicator) must be Y, N, or NULL
  • PUBIND='Y' and CONIND='Y' simultaneously is not permitted — a record cannot be both published and confidential

Full Replace Execution

  • After validation, triggers: DELETE FROM ABSD_OWIN WHERE OWCODE = @owcode
  • Then: INSERT INTO ABSD_OWIN (...) SELECT ... FROM inserted with validated values
  • This guarantees ABSD_OWIN always reflects a fully-validated consistent state

Staging and Audit

  • Inserts into OWIN_UPDATES staging table
  • Writes to UTIL_OWIN_UPDATE audit log table with before/after state, user, and timestamp

OWNC — Owner to Vessel Link

ABSD_OWNC_Update

FOR UPDATE, INSERT
Table
dbo.ABSD_OWNC
Guard
TRIGGER_DISABLE (standard)
Key
OWCODE + SHLRNO
Staging
  • Inserts/replaces into OWNC_UPDATES staging table, keyed by OWCODE + SHLRNO
  • No field-level validation — vessel linkage is controlled by OWXR trigger

OWNER_EXCEPTIONS — Duplicate OWCODE Prevention

OWNER_EXCEPTION_UPDATE

FOR UPDATE, INSERT
Table
dbo.ABSD_OWNER_EXCEPTIONS
Guard
TRIGGER_DISABLE (standard)
Validation
  • Prevents duplicate OWCODE entries in the exceptions table
  • On INSERT/UPDATE, checks if the OWCODE already exists with a different exception record
  • If duplicate detected, raises error: "OWCODE already exists in OWNER_EXCEPTIONS" and rolls back
  • The OWNER_EXCEPTIONS table is used to flag companies that require special handling in automated processes

OWSH — Owner Shareholding / DO Relationship

ABSD_OWSH_Update

FOR UPDATE, INSERT
Table
dbo.ABSD_OWSH
Guard
TRIGGER_DISABLE (standard)
Validation tblChanges (both perspectives)

DO Uniqueness Rule

  • Only one Dominant Owner (DO) relationship is permitted per company
  • If a new DO relationship is inserted and one already exists for this OWCODE, the trigger raises an error and rolls back

Null-Shift Logic

  • Special pattern: if REL1_1 (first relationship party) is NULL but REL1_2 (second relationship party) is NOT NULL, the trigger shifts the values — sets REL1_1 = REL1_2 and REL1_2 = NULL
  • This normalises the data so the primary relationship slot is always populated first

tblChanges — Both Perspectives

  • Ownership relationships involve two companies; tblChanges is written twice — once from the owning company's perspective and once from the owned company's perspective
  • This ensures both parties' audit trails reflect the relationship change

OWSH_Delete

FOR DELETE NO TRIGGER_DISABLE GUARD
No TRIGGER_DISABLE guard — fires unconditionally on all deletes.
  • Captures deleted OWSH key to OWSH_DELETES staging table
  • Writes tblChanges entries from both relationship parties' perspectives: "DO relationship deleted"

OWST — Owner Statistics / Fleet Count Summary

ABSD_OWST_Update

FOR UPDATE, INSERT
Table
dbo.ABSD_OWST
Guard
TRIGGER_DISABLE (standard)
Staging
The OWST_Update trigger itself only handles staging. The OWST rebuild logic (the 5-part fleet count calculation) is invoked as a stored procedure by OWGE_Update and OWXR_Update whenever fleet composition changes.

5-Part IRP / RP / P Fleet Count Rebuild

Called via stored procedure from OWGE and OWXR triggers. The algorithm rebuilds five fleet count buckets:

  • IRP (In-Register, Published): Count of vessels currently on LR register with PUBIND='Y'
  • RP (Register, Published): Count including historical register entries
  • P (Published): Total published fleet count
  • Total fleet: All vessel relationships regardless of publication status
  • GT aggregate: Sum of gross tonnage across the fleet

Staging

  • Inserts/replaces into OWST_UPDATES staging table for downstream processing

OWXR — Owner to Vessel Relationship (Ownership Role)

OWXR_Update

FOR UPDATE, INSERT
Table
dbo.ABSD_OWXR
Guard
TRIGGER_DISABLE (standard)
Cursor
Yes — per-OWCODE+LRNO loop
Validation Cascade → OWST, NATY2, PERSONNEL tblChanges (both perspectives) Staging EDM Dec 2025
OWXR is the central owner-vessel relationship trigger. It is one of the most complex company triggers, enforcing role uniqueness, vessel eligibility, and maintaining multiple downstream tables including ABSD_PERSONNEL and ABSD_OWST.

OWCODE / FXCODE Foreign-Key Validation

  • OWCODE must exist in ABSD_OWGE — company must be registered before a vessel relationship can be created
  • FXCODE (fleet index code) must exist in the relevant codebook when supplied
  • Both validated at the start of the cursor loop; error + rollback on failure

Maximum 1 BO (Beneficial Owner) Rule

  • Each vessel (LRNO) can have at most one ownership record with relationship type BO (Beneficial Owner)
  • Attempting to add a second BO for the same vessel raises: "A vessel can only have one Beneficial Owner" and rolls back

DO / OO Ship Check

  • For DO (Disponent Owner) and OO (Operational Owner) role types, checks that the vessel is eligible for this role
  • Vessels in certain status categories cannot have DO/OO relationships; error raised if ineligible

MR Vessel Ownership Check

  • For MR (Management Role) relationships, validates that the vessel is currently in service and has a valid LRNO in ABSD_OVGE
  • If vessel is not active, MR relationship creation is blocked

Legacy BO Validations (Commented Out)

  • Previous versions enforced BO-to-BO and MR-to-MR relationship restrictions (no cross-group transfers)
  • These rules were removed at EDM go-live (User Stories 58589 / 60386); code is preserved as comments in the trigger body

NATY2 Cascade

  • When an OWXR record is inserted/updated, cascades the company's NATY2 (nationality) from ABSD_OWGE to the OWXR record itself
  • Uses vwABSD_OWXR_EDM (EDM Dec 2025) to identify related records for the cascade

PUBLIND Rules

  • PUBLIND (publication indicator) must be Y, N, or NULL
  • Certain role types mandate a specific PUBLIND value; violation raises a descriptive error

valOwnerRelationship Validation

  • The relationship type code is validated against the permitted set via valOwnerRelationship stored procedure
  • Returns an error message if the code is invalid for the current context

OWST Fleet Count Rebuild

  • After any insert/update, calls the OWST rebuild stored procedure for the affected OWCODE
  • Recalculates the 5-part IRP/RP/P/Total/GT fleet count summary

ABSD_PERSONNEL Update

  • Updates ABSD_PERSONNEL.JOB_POSITION for this OWCODE where the person's role matches the relationship type
  • Keeps the personnel directory in sync with ownership role assignments

tblChanges — Both Perspectives

  • Writes to tblChanges from the vessel's perspective (LRNO key) and from the company's perspective (OWCODE key)
  • Fields logged: relationship type, effective date, end date, PUBLIND

Staging and Annotation

  • Inserts/replaces into staging table for downstream processing
  • Calls annotation stored procedure via spGetUserSettingsOwners context

OWXR_Delete

FOR DELETE NO TRIGGER_DISABLE GUARD
No TRIGGER_DISABLE guard — fires unconditionally on all deletes.

DO Ship Check on Delete

  • Before completing the delete, checks if the vessel being unlinked was the Disponent Owner's only remaining vessel
  • If so, may trigger warnings or related cleanup for the DO fleet

PERSONNEL Cleanup

  • If the deleted relationship was the last ownership role for this OWCODE+personnel combination, removes the corresponding ABSD_PERSONNEL job position record

Staging and Audit

  • Captures deleted key to OWXR_DELETES staging table
  • Writes tblChanges entries from both the vessel and company perspectives: "Ownership relationship deleted: [role] [LRNO]"

Cross-Reference: OW* Trigger Summary

Trigger Event Guard Pattern Key Downstream
ABSD_OWGE_Update U/I Standard Cursor; validation; cascade OWGE_UPDATES, vwABSD_OWXR_EDM (EDM Dec 2025), OWST rebuild, tblChanges
OWGE_Delete D None Simple staging OWNDEL_UPDATES
ABSD_OWNA_Update U/I Standard Cursor; 7-step best address; cascade OWNA_UPDATES, ABSD_OWIN, ABSD_PERSONNEL, ABSD_OWNER_SEARCH
ABSD_OWAD1_Update U/I Standard Cursor; field validation; postcode regex tblChanges; COUNTRY/TOWN/STREET FKs disabled Feb 2026
ABSD_OWAD1_Delete D Standard Cursor; CO relationship cleanup spDeleteCORelationship, tblChanges
ABSD_OWAD2_Update U/I Standard Simple staging + OWIN touch OWAD2_UPDATES, ABSD_OWIN.LSTCHNGE
OWAN_Update U/I Standard Simple staging OWAN_UPDATES
ABSD_OWCA_Update U/I Standard Staging keyed OWCODE+SHLRNO+INNO OWCA_UPDATES
OWCN_UPDATE U/I None Cursor; tblChanges; secondary annotation on U only tblChanges
OWCN_DELETE D None tblChanges "Note deleted" tblChanges
ABSD_OWCO_Update U/I Standard TYPE+CNUM validation; OWAD1 sync OWCO_UPDATES, ABSD_OWAD1 comms fields, tblChanges
OWCODelete D None Last-record null-out OWAD1 ABSD_OWAD1 comms fields, tblChanges
ABSD_OWDC_Update U/I Standard Cursor; SEQNO='00' current rule tblChanges
ABSD_OWDC_DELETE D Standard Cursor; "DOC Deleted" tblChanges
OWIN_Update INSTEAD OF U/I TRIGGER_DISABLE_OWIN + TRIGGER_DISABLE Validate → DELETE + INSERT full replace OWIN_UPDATES, UTIL_OWIN_UPDATE
ABSD_OWNC_Update U/I Standard Simple staging OWNC_UPDATES
OWNER_EXCEPTION_UPDATE U/I Standard Duplicate OWCODE prevention
ABSD_OWSH_Update U/I Standard DO uniqueness; null-shift; tblChanges x2 tblChanges (both perspectives)
OWSH_Delete D None Staging + tblChanges x2 OWSH_DELETES, tblChanges
ABSD_OWST_Update U/I Standard Staging only; rebuild called externally OWST_UPDATES
OWXR_Update U/I Standard Cursor; full FK+role validation; cascade vwABSD_OWXR_EDM, OWST rebuild, PERSONNEL, tblChanges x2
OWXR_Delete D None DO check; PERSONNEL cleanup; tblChanges x2 OWXR_DELETES, ABSD_PERSONNEL, tblChanges