LR Maritime Database · ABSD_FU* Trigger Series · Business Rules & Transformation Logic
The FU* trigger series guards the cargo, capacity, and operational characteristics tables. These triggers enforce data quality rules for vessel load data that flows downstream into SHIP_SEARCH (the public-facing vessel search index) and into ShipWatch analytics feeds.
1 suffix (FUCA1, FUCO1, FUDI1, FUHA1, FULI1, FURO1, FUST1, FUUN1) hold the single summary/header row per vessel. Tables with a 2, 3, or 4 suffix hold child detail rows. The header trigger typically validates all field-level business rules; the detail triggers apply FK lookups and simpler checks. All DELETE triggers fire unconditionally (no TRIGGER_DISABLE guard) and only write a J06 audit entry.
IF NOT EXISTS (SELECT * FROM TRIGGER_DISABLE). All UPDATE/INSERT triggers except FUOF and the DELETE triggers check this. FUTO adds an inner TRIGGER_DISABLE_FUTO guard.valStandard4_new (EFD dates), valStandard8 (source codes), valStandard1 (version flags), valStandard2 (confidence codes), valStandard3Num (CC/value pairs).COUNT(*) joins against ABSD_CBUB1, ABSD_CBUB3 (or EDM.dbo.T_REF_CBUB3) using case-sensitive collation COLLATE SQL_Latin1_General_CP1_CS_AS.UPDATE ABSD_OVGE SET J06_AUTHOR = ..., J06_LNCHDATE = ... for all affected LRNOs.ABSD_XXXX_UPDATES shadow table.tblAnnotationLogGeneral via grouping lookup from indAnnotation_SecondaryGroupings.ABSD_FUCA1 holds the single cargo capacity summary record per vessel. The trigger validates the effective date and source code, writes the J06 audit stamp, refreshes the staging shadow table, and logs a secondary annotation.
D08_EFD (effective date) — validated via valStandard4_new; must be a valid YYMMDD date.D08_SRCE (source code) — validated via valStandard8; must match an approved source lookup value.ABSD_OVGE.J06_AUTHOR + J06_LNCHDATE for all inserted LRNOs.ABSD_FUCA1_UPDATES from inserted (not the base table).ABSD_FUCA1, Fieldname=D08_EFD.ABSD_FUCA2 holds per-cargo-type detail rows for a vessel (multiple rows per LRNO). Each row records a stowage mode and commodity combination. The trigger enforces referential integrity against two CBUB1 codebook tables.
COLLATE SQL_Latin1_General_CP1_CS_AS for case-sensitive matching — codes differing only in case will fail validation.
| Field | Rule | Codebook |
|---|---|---|
D08_STOWAGE | Must exist in ABSD_CBUB1 where FLDI='01' (stowage modes) | CBUB1 Table 01 |
D08_COMMODITY | Must exist in ABSD_CBUB1 where FLDI='02' (commodity types) | CBUB1 Table 02 |
If either FK check fails, the entire transaction is rolled back with an error message.
ABSD_OVGE for affected LRNOs.ABSD_FUCA2_UPDATES from the base table (SELECT * FROM ABSD_FUCA2 WHERE LRNO IN (SELECT LRNO FROM inserted)), not from inserted — captures the full post-update row set.ABSD_FUCA2, Fieldname=D08_TOWAGE.ABSD_AWSH_UPDATES integration exists but is disabled.ABSD_FUCA2_DELETE fires unconditionally (no TRIGGER_DISABLE guard) and only writes the J06 audit entry from the deleted pseudo-table.
ABSD_FUCO1 holds the single container data overview record per vessel (overall containerisation capability). ABSD_FUCO2 holds the detail rows per container size/type.
| Field | Validator | Notes |
|---|---|---|
D09_EFD | valStandard4_new | Effective date — YYMMDD format |
D09_SRCE | valStandard8 | Source code |
D09_VER | valStandard1 | Version/confidence flag |
ABSD_OVGE.ABSD_FUCO1_UPDATES from inserted.ABSD_FUCO1, Fieldname=D09_EFD.The detail trigger follows the same delete-only-J06 pattern for FUCO2_DELETE. The update trigger adds validation similar to FUCA2 but for container-type-specific fields.
Records vessel dimensions relevant to manoeuvrability: bow thruster diameter, manoeuvring bow length. The trigger was redesigned in October 2007 to use a cursor loop over inserted to support bulk updates (multiple vessels in one statement).
| Field | Rule | Codebook |
|---|---|---|
D22_MAN_TYP | FK check — must exist in ABSD_CBUB3 where TABNO='01' (manoeuvrability type codes); case-sensitive join | CBUB3 Table 01 |
| Field(s) | Rule |
|---|---|
D22_EFD | valStandard4_new — effective date format |
D22_VER | valStandard1 — version flag |
D22_DD_CC + D22_DIS_DIAM | valStandard3Num — confidence code / thruster discharge diameter pair |
D22_MANBOW_LEN > 0 requires OVTY D01_INT_BASIC to match pattern x3xxx, xx3xx, xxx3x, xxxx3, or xxx6x (vessels with side-entry bow thrusters)ABSD_HILE C02_LBP (or C02_LOA if LBP < 1): the manbow length must not exceed the vessel's LBP/LOAvalStandard3NumABSD_OVGE for the current INDEXLRNO.ABSD_FUDI1_UPDATES from inserted WHERE LRNO = @INDEXLRNO.D21_efd or D21_srce changes → group: ABSD_FUDI1/D21_efdD22_srce, D22_dis_diam, D22_efd, D22_man_typ, or D22_manbow_len changes → group: ABSD_FUDI1/D22_srceEach has a DELETE trigger (unconditional J06 only) and an UPDATE trigger following the same validation-staging-annotation pattern for their respective dimension fields.
Records vessel draft, freeboard, and loadline assignment zone data. FUDO1 holds the summary; FUDO2 holds per-loadline zone detail rows.
Follows the standard FU* pattern: EFD via valStandard4_new, SRCE via valStandard8, VER via valStandard1, CC fields via valStandard2, CC/value pairs via valStandard3Num. J06 audit, staging refresh from inserted, secondary annotation on the EFD group.
ABSD_FUDO2_DELETE is unconditional J06 only.
The most complex cargo trigger. ABSD_FUGE is the central general-data record per vessel, carrying passenger berthing capacities, crew numbers, hold cargo volumes (grain, bale, liquid, gas, oil), number of winches, nuclear power indicator, and auxiliary propulsion indicator. Changes to capacity and passenger fields flow directly into ABSD_SHIP_SEARCH.
| Field | Max Digits | Description |
|---|---|---|
D18_WNCHS_NO | 2 | Number of deck winches |
D06_PASS_UN | 4 | Unberthed passenger capacity |
D06_PASS_DK | 4 | Deck passenger capacity |
D06_PASS_BR | 4 | Berthed passenger capacity |
D06_CREW_NO | 4 | Crew number |
D06_CBNS | 4 | Number of cabins |
D06_DVBR | 4 | Number of driver berths |
D10_GRAIN | 8 | Grain capacity (m³ or ft³) |
D10_BALE | 8 | Bale capacity |
D10_INULTD | 8 | Insulated cargo capacity |
D10_LQD | 8 | Liquid cargo capacity (general) |
D10_LQG | 8 | Liquefied gas capacity |
D10_OIL | 8 | Oil cargo capacity |
D10_SEG_BLLST | 8 | Segregated ballast capacity |
D10_CLN_BLLST | 8 | Clean ballast capacity |
D10_VRT_BALE | 8 | Vertical bale capacity |
D10_OTHER_CAP | 8 | Other capacity |
| Field(s) | Validator | Notes |
|---|---|---|
DOB | valStandard4_new | Date of build — YYMMDD |
D06_EFD | valStandard4_new | Passenger/crew effective date |
D06_CC | valStandard2 | Confidence code |
D06_SRCE | valStandard8 | Source code |
D06_PASS_UN_VER | valStandard1 | Unberthed pax version flag |
D06_PASS_DK_VER | valStandard1 | Deck pax version flag |
D06_PASS_BR_VER | valStandard1 | Berthed pax version flag |
D06_PASS_UN + D06_P_UN_CC | valStandard3Num | Unberthed pax CC/value pair |
D06_CREW_VER | valStandard1 | Crew version flag |
D06_DVBR_VER | valStandard1 | Driver berth version flag |
D10_EFD | valStandard4_new | Cargo capacity effective date |
D10_SRCE | valStandard8 | Capacity source code |
D10_VER | valStandard1 | Capacity version flag |
D10_G_CC / D10_B_CC / D10_I_CC / D10_LQD_CC / D10_LQG_CC / D10_OIL_CC / D10_SB_CC / D10_CB_CC / D10_VB_CC / D10_O_CC | valStandard2 | Individual capacity confidence codes |
D10_HC_VER | valStandard1 | Hold capacity version flag |
D10_HTNG_CLS | IN ('C','P','N','U','Y') | Heating class — C=Coil, P=Pipe, N=None, U=Unknown, Y=Yes-unspecified. Only validated when not NULL. |
D18_EFD | valStandard4_new | Deck equipment effective date |
D18_CC | valStandard2 | Deck equipment confidence code |
D18_SRCE | valStandard8 | Deck equipment source code |
D18_VER | valStandard1 | Deck equipment version flag |
D18_W_CC + D18_WNCHS_NO | valStandard3Num | Winch count CC/value pair |
D25_EFD | valStandard4_new | Special features effective date |
D25_CC | valStandard2 | Special features confidence code |
D25_SRCE | valStandard8 | Special features source code |
D25_VER | valStandard1 | Special features version flag |
D25_AUX_PROP | IN ('N','U','Y') | Auxiliary propulsion indicator. Only validated when not NULL. |
D25_NUCLR_PWR | IN ('N','U','Y') | Nuclear power indicator. Only validated when not NULL. |
D18_WNCHS_NO > 0, the vessel's lifting gear detail (ABSD_FULI2 for SEQ_NO='01') must have D19_LG_TYP IN ('DE','AF') (electric winch / after-fitted lifting gear). If any FULI2 rows have a different type code, the update is rejected.
IF @PASSEDNUM > 0 AND @PASSEDNUMTWO > 0 -- FULI2 rows with non-electric type
RAISERROR('D18_WNCHS_NO cannot be > 0 unless D19_LG_TYP is DE or AF', 16, 1)
D10_LQG, D10_INULTD, D10_LQD, D10_GRAIN, D10_BALE, D06_PASS_BR, D06_PASS_DK, D06_PASS_UN, D10_OIL.
UPDATE ABSD_SHIP_SEARCH SET GASCAP = D10_LQG, INSULATEDCAP= D10_INULTD, LIQUID = D10_LQD, GRAIN = D10_GRAIN, BALE = D10_BALE, PASSENGERS = (D06_PASS_DK + D06_PASS_BR + D06_PASS_UN), -- sum of all three berth types OILCAP = D10_OIL FROM ABSD_SHIP_SEARCH INNER JOIN INSERTED ON ABSD_SHIP_SEARCH.LRNO = INSERTED.LRNO WHERE ABSD_SHIP_SEARCH.LRNO = @INDEXLRNO
| Trigger Condition | Grouping Lookup Key |
|---|---|
D06_CBNS, D06_CREW_NO, D06_DVBR, D06_EFD, D06_PASS_BR, D06_PASS_DK, D06_PASS_UN, D06_SRCE | ABSD_FUGE / D06_CREW_NO |
D10_BALE, D10_CLN_BLLST, D10_EFD, D10_GRAIN, D10_HTNG_CLS, D10_INULTD, D10_LQD, D10_LQG, D10_OIL, D10_OTHER_CAP, D10_OTHER_TYP, D10_SEG_BLLST, D10_SRCE, D10_VRT_BALE | ABSD_FUGE / D10_BALE |
D18_WNCHS_NO, D18_EFD, D18_SRCE | ABSD_FUGE / D18_WNCHS_NO |
D25_EFD, D25_NUCLR_PWR, D25_SRCE, D25_AUX_PROP | ABSD_FUGE / D25_EFD |
DOB | ABSD_FUGE / DOB |
D02_SERVICE | ABSD_FUGE / D02_Service |
Records hatch data summary for a vessel (hatch count, dimensions, cover type). ABSD_FUHA2 holds per-hatch detail rows.
| Field | Validator | Notes |
|---|---|---|
D16_EFD | valStandard4_new | Effective date |
D16_VER | valStandard1 | Version flag |
D16_CC | valStandard2 | Confidence code |
D16_SRCE | valStandard8 | Source code |
ABSD_FUHA1_UPDATES from inserted), secondary annotation on D16_EFD group.ABSD_FUHA2_DELETE is unconditional J06 only. The update trigger validates per-hatch fields and refreshes ABSD_FUHA2_UPDATES.
Records liquid cargo capacity in detail (e.g. total liquid cargo capacity with units). Single row per vessel.
| Field | Rule |
|---|---|
D14_LCAP | Max 7 digits (digit-length check via LEN()) |
D14_EFD | valStandard4_new — effective date |
D14_SRCE | valStandard8 — source code |
D14_VER | valStandard1 — version flag |
D14_LC_CC | valStandard2 — confidence code |
J06 audit, staging (ABSD_FULC_UPDATES from inserted), secondary annotation on D14_EFD group.
ABSD_FULI1 holds the lifting gear overview record per vessel (total number of cranes, derricks, SWL totals). ABSD_FULI2 and ABSD_FULI3 hold per-piece lifting gear detail. Note: FUGE.D18_WNCHS_NO (winch count) cross-checks FULI2 D19_LG_TYP — see FUGE documentation above.
| Field | Validator | Notes |
|---|---|---|
D19_EFD | valStandard4_new | Effective date |
D19_SRCE | valStandard8 | Source code |
D19_LIFT_CAP_VER | valStandard1 | Lifting capacity version flag |
D19_LIFT_GEAR_VER | valStandard1 | Lifting gear version flag |
D19_CC | valStandard2 | Confidence code |
J06 audit, staging (ABSD_FULI1_UPDATES from inserted), secondary annotation on D19_EFD group.
Both have unconditional DELETE triggers (J06 only) and UPDATE triggers validating per-crane/derrick fields. D19_LG_TYP in FULI2 is constrained to codes in a lifting gear type codebook and is referenced by the FUGE winch count cross-check.
Records offshore vessel-specific features (e.g. dynamic positioning, deck strength, moonpool). Unusually, all three DML events (UPDATE, INSERT, DELETE) are combined in a single trigger named ABSD_FUOF_All.
TRIGGER_DISABLE) is active.
IF NOT EXISTS (SELECT * FROM TRIGGER_DISABLE)
BEGIN
UPDATE dbo.ABSD_OVGE
SET J06_AUTHOR = UPPER(LEFT(RIGHT(SYSTEM_USER, ...), 3)),
J06_LNCHDATE = ...
WHERE ABSD_OVGE.LRNO IN (
SELECT LRNO COLLATE Latin1_General_CI_AS FROM inserted
);
END
Note the use of COLLATE Latin1_General_CI_AS (case-insensitive) on the LRNO join — unlike most FU* triggers which use no explicit collation on the LRNO join.
Records Ro-Ro vessel lane configuration: number of lanes, lane length/width/height, vehicle and lorry capacities. Used for ferry and car carrier data quality.
| Field | Max Digits | Description |
|---|---|---|
D13_LANES_NO | 3 | Number of lanes |
D13_LANE_LEN | 6 | Total lane length (m) |
D13_LANE_CARS | 5 | Car capacity |
D13_LANE_WAGS | 5 | Wagon/railway car capacity |
D13_LANE_LOR | 5 | Lorry capacity |
| Field(s) | Validator |
|---|---|
D13_EFD, D23_EFD | valStandard4_new |
D13_SRCE, D23_SRCE | valStandard8 |
D13_VER, D23_VER | valStandard1 |
D13_LN_CC + D13_LANES_NO | valStandard3Num |
D13_LL1_CC + D13_LANE_LEN | valStandard3Num |
D13_LW_CC + D13_LANE_WID | valStandard3Num |
D13_LH_CC + D13_LANE_HGT | valStandard3Num Duplicated in source |
D13_LC_CC + D13_LANE_CARS | valStandard3Num |
D13_WAG_CC + D13_LANE_WAGS | valStandard3Num |
D13_LL2_CC + D13_LANE_LOR | valStandard3Num |
D13_LH_CC / D13_LANE_HGT validation via valStandard3Num appears twice in the trigger source — this is a copy-paste artefact that has no functional impact (the check is simply run twice).
D13_LANE_LEN > 0 and D13_LANES_NO > 0, the trigger computes the per-lane average length and compares it against the vessel's overall length from ABSD_HILE:
SELECT @PASSEDNUM = D13_LANE_LEN / D13_LANES_NO FROM inserted
SELECT @PASSEDNUMTWO = C02_LOA FROM ABSD_HILE WHERE LRNO IN (SELECT LRNO FROM inserted) AND SEQNO='00'
IF @PASSEDNUM > @PASSEDNUMTWO
RAISERROR('D13_LANE_LEN / D13_LANES_NO cannot exceed C02_LOA, in this case ' + CAST(@PASSEDNUMTWO AS VARCHAR(8)), 16, 1)
ABSD_FURO1_UPDATES from inserted).ABSD_FUSF holds up to 15 ship feature/equipment codes per vessel (e.g. crane type, deck equipment, special facilities). Each code slot is independently validated against the ship features codebook.
| Field | Rule |
|---|---|
D07_EFD | valStandard4_new — effective date |
D07_VER | valStandard1 — version flag |
D07_SRCE | valStandard8 — source code |
D07_CODE_1 through D07_CODE_15 | Each slot individually validated against ABSD_CBUB1 where FLDI='12' (ship features). Null slots are skipped — only non-null values are checked. |
IF UPDATE(D07_CODE_N) AND (SELECT COUNT(*) FROM inserted WHERE D07_CODE_N IS NOT NULL) > 0
BEGIN
IF NOT (SELECT COUNT(*) FROM ABSD_FUSF, ABSD_CBUB1
WHERE ABSD_FUSF.D07_CODE_N COLLATE SQL_Latin1_General_CP1_CS_AS = ABSD_CBUB1.CODE
AND ABSD_CBUB1.FLDI = '12'
AND LRNO IN (SELECT LRNO FROM INSERTED)) > 0
RAISERROR('The code in D07_CODE_N does not match a record in table 12 of CBUB1', 16, 1)
END
This pattern means a previously filled slot can be cleared to NULL without a codebook check, but setting it to any non-null value (including whitespace) triggers the FK validation.
J06 audit, staging (ABSD_FUSF_UPDATES from inserted), secondary annotation on D07_EFD group.
ABSD_FUSF2_DELETE is unconditional J06 only.
Records general ship particulars (cumulative capacity, special designations). The trigger is minimal — it contains no field-level validation.
absd_fusp_update performs only J06 audit and secondary annotation. There are no IF UPDATE() validation blocks. This may be intentional for a table managed primarily via automated bulk feeds, or the validations may have been omitted at implementation time. The trigger name is lowercase (unlike all other FU* triggers) which suggests a different author/vintage.
ABSD_FUSP, Fieldname=CAP_CUM.Unconditional J06 only (no TRIGGER_DISABLE guard).
Records cargo segregation data: how many segregated cargo spaces a vessel has. D12_CARGO_SEG (number of segregated segments) must pass a complex validation routine delegated to a stored procedure.
| Field | Validator | Notes |
|---|---|---|
D12_EFD | valStandard4_new | Effective date |
D12_SRCE | valStandard8 | Source code |
D12_VER | valStandard1 | Version flag |
D12_CARGO_SEG | spValidateD12_CARGO_SEG (stored proc) | Returns RETCODE=0 on failure, RETMESSAGE with error text. Called as: exec spValidateD12_CARGO_SEG @INDEXLRNO, '00', 'D12_CARGO_SEG', null, null, @D12_CARGO_SEG, @RETCODE OUTPUT, @RETMESSAGE OUTPUT |
D12_CARGO_SEG must be 0 or >1 (value of exactly 1 was forbidden). It also used a direct valStandard3Num check on the D12_CS_CC/D12_CARGO_SEG pair. The current trigger delegates all of this to spValidateD12_CARGO_SEG, which encapsulates the business logic externally.
ABSD_FUST1_UPDATES from inserted WHERE LRNO = @INDEXLRNO.Records anchor chain/rope, towing gear, and bollard pull data for vessels — particularly relevant for tugs and offshore support vessels. Has a second guard table TRIGGER_DISABLE_FUTO for bulk anchor data operations.
IF NOT EXISTS (SELECT * FROM TRIGGER_DISABLE) -- outer: global enable
BEGIN
IF NOT EXISTS (SELECT * FROM TRIGGER_DISABLE_FUTO) -- inner: per-operation enable
BEGIN
-- all validation and cascade logic
END
END
| Field | Max Digits | Description |
|---|---|---|
D20_AT_NO1 | 2 | Anchor type 1 — number of anchors |
D20_AT_NO2 | 2 | Anchor type 2 — number of anchors |
| Field(s) | Validator |
|---|---|
D20_EFD | valStandard4_new |
D20_VER | valStandard1 |
D20_SRCE | valStandard8 |
D20_CC, D20_ATS_CC1, D20_ATN_CC1, D20_ATSRL_CC, D20_ATSRD_CC, D20_ATSRS_CC, D20_BP_CC | valStandard2 |
D20_AT_SWL1 + D20_ATS_CC1 | valStandard3Num |
D20_AT_NO1 + D20_ATN_CC1 | valStandard3Num |
D20_AT_SRLEN + D20_ATSRL_CC | valStandard3Num — stud-link rope length |
D20_AT_SRDIAM + D20_ATSRD_CC | valStandard3Num — stud-link rope diameter |
D20_AT_SRSWL + D20_ATSRS_CC | valStandard3Num — stud-link rope SWL |
D20_BLLRD_PL + D20_BP_CC | valStandard3Num — bollard pull |
D20_BLLRD_VER | valStandard1 |
D01_INT_BASIC and the 5 type slots:
D20_AT_TYP1 IN ('A','T','C','Y')
AND D01_INT_BASIC NOT LIKE '__4__' -- not xx4xx (offshore/tug)
AND D01_TYP_A/B/C/D/E NOT IN ('224') -- not offshore code 224
→ RAISERROR('D20_AT_TYP1 cannot be A T C or Y unless D01_INT_BASIC is xx4xx or D01_TYP=224')
D20_AT_SWL1 must be 0 (no safe working load without a gear type)D20_AT_NO1 must be 0 (no anchor count without a type)ABSD_HIBR:
SELECT @PASSEDNUMTWO = C09_EX FROM ABSD_HIBR WHERE LRNO IN (SELECT LRNO FROM INSERTED) AND SEQNO='00'
IF @PASSEDNUM > @PASSEDNUMTWO
RAISERROR('D20_AT_SRLEN must be less than C09_EX, in this case ' + CAST(@PASSEDNUMTWO AS VARCHAR(20)), 16, 1)
D20_AT_SRLEN > 1, the vessel must have D01_TYP_A/B/C/D/E = '224' (offshore vessel type). Non-offshore vessels cannot have rope length data.
A previously active check that required D20_BLLRD_PL > 0 only for vessels with D01_INT_BASIC LIKE '__4__' or TYP codes 224, 065, 066, 067, 261, 264, 265, 262 was removed at the request of Michael Ayers on 23/07/2009. The commented-out code remains as documentation.
| Field | Codebook |
|---|---|
D20_AT_TYP1 | ABSD_CBUB1 where FLDI='30' (anchor/towing type codes). Note: uses < 1 comparison (less than), unlike the usual NOT > 0 pattern. |
J06 audit, staging (ABSD_FUTO_UPDATES from inserted), secondary annotation on D20_EFD group.
EDM.dbo.T_REF_CBUB3 (the EDM reference table) instead of the local ABSD_CBUB3. This is the second FU* trigger to be EDM-migrated (alongside FUUN1; HIMO was the first machinery trigger in April 2026).
Records container/TEU capacity per vessel: total TEU capacity, reefer plug count, and up to three location codes (H=Hold, R=Ramp, D=Deck) indicating where containers can be stowed. The location codes have strict sequential and ordering constraints.
| Field | Max Digits | Description |
|---|---|---|
D11_TEU_CAP | 5 | TEU capacity (max 99999) |
D11_REF_CP | 4 | Reefer plug count |
| Field(s) | Validator |
|---|---|
D11_EFD | valStandard4_new |
D11_VER | valStandard1 |
D11_SRCE | valStandard8 |
D11_CC | valStandard2 |
D11_TEU_CAP + D11_TEU_CC | valStandard3Num |
D11_TEU_VER | valStandard1 |
D11_REF_CP + D11_RCP_CC | valStandard3Num |
| Field | Nullable? | Codebook |
|---|---|---|
D11_LOC_1 | Mandatory (always validated) | EDM.dbo.T_REF_CBUB3 where TABNO='02' (container location codes) |
D11_LOC_2 | Optional (validated only when not NULL) | Same |
D11_LOC_3 | Optional (validated only when not NULL) | Same |
IF D11_LOC_3 IS NOT NULL AND (D11_LOC_2 IS NULL OR D11_LOC_2 IN ('U','Y','N'))
→ ERROR: 'The codes in D11_LOC must be filled in in sequence'
IF D11_LOC_2 IS NOT NULL AND (D11_LOC_1 IS NULL OR D11_LOC_1 IN ('U','N','Y'))
→ ERROR: same
Permitted single values: H, R, D Permitted two-value combos: HH, HR, HD, RR, RD, DD Permitted three-value combos: HHH, HHR, HRR, HRD, HHD, HDD, RRR, RRD, RDD, DDDAny combination not in this list (e.g. DHR, RH) is rejected with error 'The codes in D11_LOC must be filled in in order H R D'.
ABSD_FUUN1_UPDATES from inserted).D11_REF_CP is being updated → group: ABSD_FUUN1/D11_REF_CPD11_TEU_CAP is being updated → group: ABSD_FUUN1/D11_TEU_CAPABSD_FUUN1/D11_EFDABSD_FUUN2_DELETE is unconditional J06 only. The ABSD_FUUN2_Update trigger validates per-container-type unit load fields.
| Table | Trigger(s) | Purpose | Key Rules | SHIP_SEARCH | Staging Table | EDM |
|---|---|---|---|---|---|---|
ABSD_FUCA1 |
FUCA1_Update | Cargo capacity summary | D08_EFD, D08_SRCE | No | FUCA1_UPDATES (inserted) | No |
ABSD_FUCA2 |
FUCA2_Update, FUCA2_DELETE | Cargo capacity detail | D08_STOWAGE→CBUB1[01], D08_COMMODITY→CBUB1[02] | No | FUCA2_UPDATES (base table) | No |
ABSD_FUCO1 |
FUCO1_Update | Container overview | D09_EFD, D09_SRCE, D09_VER | No | FUCO1_UPDATES (inserted) | No |
ABSD_FUCO2 |
FUCO2_Update, FUCO2_DELETE | Container detail | Standard format checks | No | FUCO2_UPDATES | No |
ABSD_FUDI1 |
FUDI1_Update (cursor) | Dimensions/manoeuvrability | D22_MAN_TYP→CBUB3[01]; D22_DIS_DIAM CC pair; 2 anno groups | No | FUDI1_UPDATES (inserted) | No |
ABSD_FUDI2/3/4 |
Update + DELETE per table | Dimension detail rows | Standard format checks | No | Per-table UPDATES | No |
ABSD_FUDO1/2 |
Update + DELETE per table | Draft/loadline | Standard format checks + CC pairs | No | Per-table UPDATES | No |
ABSD_FUGE |
FUGE_Update (cursor) | General data — pax/crew/hold caps | 17 capacity fields; D18_WNCHS_NO cross-check FULI2; HTNG_CLS enum; AUX_PROP enum; 6 anno groups | Yes: GRAIN, BALE, LIQUID, GASCAP, INSULATEDCAP, OILCAP, PASSENGERS | FUGE_UPDATES (inserted) | No |
ABSD_FUHA1 |
FUHA1_Update | Hatch overview | D16_EFD, CC, SRCE, VER | No | FUHA1_UPDATES (inserted) | No |
ABSD_FUHA2 |
FUHA2_Update, FUHA2_DELETE | Hatch detail | Per-hatch field checks | No | FUHA2_UPDATES | No |
ABSD_FULC |
FULC_Update | Liquid cargo capacity | D14_LCAP max 7 digits; EFD, SRCE, VER, CC | No | FULC_UPDATES (inserted) | No |
ABSD_FULI1 |
FULI1_Update | Lifting gear overview | EFD, two VER flags, SRCE, CC | No | FULI1_UPDATES (inserted) | No |
ABSD_FULI2/3 |
Update + DELETE per table | Lifting gear detail | D19_LG_TYP referenced by FUGE winch check | No | Per-table UPDATES | No |
ABSD_FUOF |
FUOF_All (UPDATE+INSERT+DELETE) | Offshore features | J06 only; no validation | No | None | No |
ABSD_FURO1 |
FURO1_Update | Ro-Ro lane data | Lane dims; CC pairs; LOA cross-check; 3 anno groups; duplicate D13_LH_CC check | No | FURO1_UPDATES (inserted) | No |
ABSD_FURO2 |
FURO2_Update, FURO2_DELETE | Ro-Ro detail | Standard format checks | No | FURO2_UPDATES | No |
ABSD_FUSF |
FUSF_Update | Ship features codes | 15 code slots → CBUB1[12]; null slots skipped | No | FUSF_UPDATES (inserted) | No |
ABSD_FUSF2 |
FUSF2_Update, FUSF2_DELETE | Ship features detail | Standard format checks | No | FUSF2_UPDATES | No |
ABSD_FUSP |
absd_fusp_update, FUSP_DELETE | Ship particulars | No validation; J06 + annotation only | No | None | No |
ABSD_FUST1 |
FUST1_Update (cursor) | Cargo segregation | D12_CARGO_SEG → spValidateD12_CARGO_SEG | No | FUST1_UPDATES (inserted) | No |
ABSD_FUST2 |
FUST2_Update, FUST2_DELETE | Cargo segregation detail | Standard format checks | No | FUST2_UPDATES | No |
ABSD_FUTO |
FUTO_Insert (dual guard) | Anchor/towing equipment | AT_TYP→CBUB1[30]; N/U type requires SWL=0 and count=0; A/T/C/Y type requires tug/offshore type; rope len ≤ HIBR breadth; rope len requires TYP='224' | No | FUTO_UPDATES (inserted) | No |
ABSD_FUUN1 |
FUUN1_Update | Unit load (TEU/container) | TEU max 5 digits; LOC_1/2/3 → EDM.T_REF_CBUB3[02]; sequence rule; H→R→D order rule; conditional annotation | No | FUUN1_UPDATES (inserted) | Yes (Apr 2026) |
ABSD_FUUN2 |
FUUN2_Update, FUUN2_DELETE | Unit load detail | Per-container-type field checks | No | FUUN2_UPDATES | No |
The FU* series consistently uses a header + detail split: the 1-suffix table (FUCA1, FUCO1, etc.) holds a single summary row per vessel with aggregate totals and provenance metadata (EFD, SRCE, VER, CC). The 2/3/4-suffix tables hold per-item detail rows. Header triggers carry the bulk of validation logic; detail triggers apply FK lookups and simpler checks.
All DELETE triggers on detail tables fire unconditionally (no TRIGGER_DISABLE guard check) and contain only a J06 audit update using the deleted pseudo-table. This ensures that deletions are always audited even when triggers are administratively disabled for bulk operations.
Two staging refresh patterns coexist in the FU* series:
inserted (FUCA1, FUCO1, FUHA1, FULC, FULI1, FUST1, FUTO, FUUN1, FUGE, FUSF): captures only the rows that changed in the current statement.Three FU* triggers were redesigned with cursor loops: FUDI1 (Oct 2007), FUGE (Aug 2007), FUST1 (Aug 2007). All use DECLARE ... INSENSITIVE CURSOR FOR SELECT LRNO FROM inserted — the INSENSITIVE keyword takes a static snapshot, preventing cursor-internal modifications from affecting the result set. The cursor pattern was introduced to support scenarios where a single UPDATE statement touches multiple LRNOs (batch operations from the electronic data feed).
Only ABSD_FUGE writes to ABSD_SHIP_SEARCH in the cargo trigger series. The update fires within the cursor loop and covers the 7 most commercially important capacity metrics: grain, bale, liquid, gas, insulated, oil capacities, and total passengers (sum of all three berth types). All other FU* tables do not update SHIP_SEARCH — structural data (dimensions, hatch counts, Ro-Ro lanes) is not surfaced in the public search index.
Only ABSD_FUUN1 has been migrated to the EDM reference database. Its D11_LOC_1/2/3 FK lookups now query EDM.dbo.T_REF_CBUB3 instead of the local ABSD_CBUB3. All other cargo triggers still use local ABSD_CBUB1 and ABSD_CBUB3 tables for FK validation. The migration of remaining cargo codebook references is pending.
Multiple triggers (FUCA2, FURO1, FUSF, FUTO) contain commented-out blocks for updating ABSD_AWSH_UPDATES (ShipWatch analytics staging). These were never activated and represent a planned-but-unrealised integration with the ShipWatch reporting pipeline.