Script to update source field of instance records
Script to update source field of instance records
During the data saving phase in the MARC migration process for 7.9M records (tested on sprint-etesting environment), some of the records failed with optimistic locking exceptions (around 30 records) :
e70b2bb3-4764-4108-8fcd-9e5147123c05, ERROR: Cannot update record e70b2bb3-4764-4108-8fcd-9e5147123c05 because it has been changed (optimistic locking): Stored _version is 3, _version of request is <NULL> (23F09)
because some instances in mod-inventory-storage have source = FOLIO (or LINKED_DATA), while it should have been source = MARC, even if these instances have corresponding MARC-bib records in mod-source-record-storage.
To fix this issue, we need to update the source field of instances from FOLIO\LINKED_DATA → Marc where source = FOLIO\LINKED_DATA, and if they have a linked MARC bib.
SET search_path TO '%s_mod_marc_migrations';
-- Drop procedure if it already exists
DROP PROCEDURE IF EXISTS %s_mod_marc_migrations.update_instance_source();
-- Create new stored procedure
CREATE PROCEDURE %s_mod_marc_migrations.update_instance_source()
LANGUAGE plpgsql
AS $$
DECLARE
matched_count INT;
updated_count INT;
failed_count INT;
BEGIN
-- Step 1: Count instances that match criteria
SELECT COUNT(*) INTO matched_count
FROM %s_mod_inventory_storage.instance AS i
JOIN %s_mod_source_record_storage.records_lb AS r
ON r.external_id = i.id
WHERE i.jsonb ->> 'source' = 'FOLIO';
-- Step 2: Perform update and track affected rows
WITH updated AS (
UPDATE %s_mod_inventory_storage.instance AS i
SET jsonb = jsonb_set(i.jsonb, '{source}', '"MARC"', false) -- Update only "source" field
FROM %s_mod_source_record_storage.records_lb AS r
WHERE i.id = r.external_id
AND i.jsonb ->> 'source' = 'FOLIO' -- or LINKED_DATA
RETURNING i.id
)
SELECT COUNT(*) INTO updated_count FROM updated;
-- Step 3: Verify failures (rows that should have been updated but weren't)
SELECT COUNT(*) INTO failed_count
FROM %s_mod_inventory_storage.instance AS i
JOIN %s_mod_source_record_storage.records_lb AS r
ON r.external_id = i.id
WHERE i.jsonb ->> 'source' = 'FOLIO'; -- or LINKED_DATA
-- Log output messages
RAISE NOTICE 'Matched records: %', matched_count;
RAISE NOTICE 'Updated records: %', updated_count;
RAISE NOTICE 'Failed records: %', failed_count;
EXCEPTION
WHEN OTHERS THEN
RAISE NOTICE 'Error occurred: %', SQLERRM;
END;
$$;
, multiple selections available,