fix: create separate triggers for insert/update

This commit is contained in:
Scott Wilson
2024-10-05 11:01:30 -07:00
parent 1cc22a6195
commit 128b1cf856

View File

@@ -7,29 +7,49 @@ import { TableName } from "@app/db/schemas";
// this is a postgres function to keep name in-sync with slug during transition period
export const createKmsKeyNameSyncTrigger = async (knex: Knex) => {
// create function
// function to update name if slug is updated
await knex.raw(`
CREATE OR REPLACE FUNCTION on_sync_kms_key_name() RETURNS TRIGGER AS $$ BEGIN NEW."name" = NEW."slug";
CREATE OR REPLACE FUNCTION on_update_kms_key_slug() RETURNS TRIGGER AS $$ BEGIN NEW."name" = NEW."slug";
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
`);
// create trigger
// function to set name if kms key created with slug
await knex.raw(`
CREATE TRIGGER "${TableName.KmsKey}_name_sync"
BEFORE INSERT OR UPDATE OF "slug" ON ${TableName.KmsKey}
CREATE OR REPLACE FUNCTION on_insert_kms_key() RETURNS TRIGGER AS $$ BEGIN NEW."name" = coalesce(NEW."name", NEW."slug");
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
`);
// create trigger to update name if slug is updated
await knex.raw(`
CREATE TRIGGER "${TableName.KmsKey}_update_name"
BEFORE UPDATE OF "slug" ON ${TableName.KmsKey}
FOR EACH ROW
EXECUTE PROCEDURE on_sync_kms_key_name();
EXECUTE PROCEDURE on_update_kms_key_slug();
`);
// create trigger to set name if key created with slug
await knex.raw(`
CREATE TRIGGER "${TableName.KmsKey}_set_name"
BEFORE INSERT ON ${TableName.KmsKey}
FOR EACH ROW
EXECUTE PROCEDURE on_insert_kms_key();
`);
};
export const dropKmsKeyNameSyncTrigger = async (knex: Knex) => {
// drop trigger
await knex.raw(`DROP TRIGGER IF EXISTS "${TableName.KmsKey}_name_sync" ON ${TableName.KmsKey}`);
// drop triggers
await knex.raw(`DROP TRIGGER IF EXISTS "${TableName.KmsKey}_update_name" ON ${TableName.KmsKey}`);
await knex.raw(`DROP TRIGGER IF EXISTS "${TableName.KmsKey}_set_name" ON ${TableName.KmsKey}`);
// drop function
// drop functions
await knex.raw(`
DROP FUNCTION IF EXISTS on_sync_kms_key_name() CASCADE;
DROP FUNCTION IF EXISTS on_update_kms_key_slug() CASCADE;
`);
await knex.raw(`
DROP FUNCTION IF EXISTS on_insert_kms_key() CASCADE;
`);
};