
CREATE OR REPLACE FUNCTION tcg.public.FN_before_insert_TCG_MTG_Card()
RETURNS TRIGGER AS $$
BEGIN
    NEW.created_on = CURRENT_TIMESTAMP;
    NEW.updated_last_on = CURRENT_TIMESTAMP;

    IF NEW.change_set_id IS NULL THEN
		RAISE EXCEPTION 'Change Set ID must be provided.';
    END IF;
    
    RETURN NEW;
END;
$$ LANGUAGE plpgsql
;

CREATE OR REPLACE FUNCTION tcg.public.FN_before_update_TCG_MTG_Card()
RETURNS TRIGGER AS $$
BEGIN
    NEW.updated_last_on = CURRENT_TIMESTAMP;

    IF OLD.change_set_id IS NOT DISTINCT FROM NEW.change_set_id THEN
		RAISE EXCEPTION 'New Change Set ID must be provided.';
    END IF;

    INSERT INTO tcg.public.TCG_MTG_Card_Audit (
		  card_id
        , name_field
        , value_prev
        , value_new
        , change_set_id
    )
	-- Changed all_parts
	SELECT NEW.card_id, 'all_parts', OLD.all_parts, NEW.all_parts, NEW.change_set_id
		WHERE OLD.all_parts IS NOT DISTINCT FROM NEW.all_parts
	UNION
	-- Changed arena_id
	SELECT NEW.card_id, 'arena_id', CAST(OLD.arena_id AS VARCHAR), CAST(NEW.arena_id AS VARCHAR), NEW.change_set_id
		WHERE OLD.arena_id IS NOT DISTINCT FROM NEW.arena_id
	UNION
	-- Changed artist
	SELECT NEW.card_id, 'artist', OLD.artist, NEW.artist, NEW.change_set_id
		WHERE OLD.artist IS NOT DISTINCT FROM NEW.artist
	UNION
	-- Changed artist_ids
	SELECT NEW.card_id, 'artist_ids', OLD.artist_ids, NEW.artist_ids, NEW.change_set_id
		WHERE OLD.artist_ids IS NOT DISTINCT FROM NEW.artist_ids
	UNION
	-- Changed booster
	SELECT NEW.card_id, 'booster', OLD.booster::TEXT, NEW.booster::TEXT, NEW.change_set_id
		WHERE OLD.booster IS NOT DISTINCT FROM NEW.booster
	UNION
	-- Changed border_color
	SELECT NEW.card_id, 'border_color', OLD.border_color, NEW.border_color, NEW.change_set_id
		WHERE OLD.border_color IS NOT DISTINCT FROM NEW.border_color
	UNION
	-- Changed card_back_id
	SELECT NEW.card_id, 'card_back_id', OLD.card_back_id, NEW.card_back_id, NEW.change_set_id
		WHERE OLD.card_back_id IS NOT DISTINCT FROM NEW.card_back_id
	UNION
	-- Changed cmc
	SELECT NEW.card_id, 'cmc', CAST(OLD.cmc AS VARCHAR), CAST(NEW.cmc AS VARCHAR), NEW.change_set_id
		WHERE OLD.cmc IS NOT DISTINCT FROM NEW.cmc
	UNION
	-- Changed collector_number
	SELECT NEW.card_id, 'collector_number', OLD.collector_number, NEW.collector_number, NEW.change_set_id
		WHERE OLD.collector_number IS NOT DISTINCT FROM NEW.collector_number
	UNION
	-- Changed color_identity
	SELECT NEW.card_id, 'color_identity', OLD.color_identity, NEW.color_identity, NEW.change_set_id
		WHERE OLD.color_identity IS NOT DISTINCT FROM NEW.color_identity
	UNION
	-- Changed colors
	SELECT NEW.card_id, 'colors', OLD.colors, NEW.colors, NEW.change_set_id
		WHERE OLD.colors IS NOT DISTINCT FROM NEW.colors
	UNION
	-- Changed content_warning
	SELECT NEW.card_id, 'content_warning', OLD.content_warning::TEXT, NEW.content_warning::TEXT, NEW.change_set_id
		WHERE OLD.content_warning IS NOT DISTINCT FROM NEW.content_warning
	UNION
	-- Changed digital
	SELECT NEW.card_id, 'digital', OLD.digital::TEXT, NEW.digital::TEXT, NEW.change_set_id
		WHERE OLD.digital IS NOT DISTINCT FROM NEW.digital
	UNION
	-- Changed edhrec_rank
	SELECT NEW.card_id, 'edhrec_rank', CAST(OLD.edhrec_rank AS VARCHAR), CAST(NEW.edhrec_rank AS VARCHAR), NEW.change_set_id
		WHERE OLD.edhrec_rank IS NOT DISTINCT FROM NEW.edhrec_rank
	UNION
	-- Changed finishes
	SELECT NEW.card_id, 'finishes', OLD.finishes, NEW.finishes, NEW.change_set_id
		WHERE OLD.finishes IS NOT DISTINCT FROM NEW.finishes
	UNION
	-- Changed flavor_name
	SELECT NEW.card_id, 'flavor_name', OLD.flavor_name, NEW.flavor_name, NEW.change_set_id
		WHERE OLD.flavor_name IS NOT DISTINCT FROM NEW.flavor_name
	UNION
	-- Changed flavor_text
	SELECT NEW.card_id, 'flavor_text', OLD.flavor_text, NEW.flavor_text, NEW.change_set_id
		WHERE OLD.flavor_text IS NOT DISTINCT FROM NEW.flavor_text
	UNION
	-- Changed foil
	SELECT NEW.card_id, 'foil', OLD.foil::TEXT, NEW.foil::TEXT, NEW.change_set_id
		WHERE OLD.foil IS NOT DISTINCT FROM NEW.foil
	UNION
	-- Changed frame
	SELECT NEW.card_id, 'frame', OLD.frame, NEW.frame, NEW.change_set_id
		WHERE OLD.frame IS NOT DISTINCT FROM NEW.frame
	UNION
	-- Changed full_art
	SELECT NEW.card_id, 'full_art', OLD.full_art::TEXT, NEW.full_art::TEXT, NEW.change_set_id
		WHERE OLD.full_art IS NOT DISTINCT FROM NEW.full_art
	UNION
	-- Changed game_changer
	SELECT NEW.card_id, 'game_changer', OLD.game_changer::TEXT, NEW.game_changer::TEXT, NEW.change_set_id
		WHERE OLD.game_changer IS NOT DISTINCT FROM NEW.game_changer
	UNION
	-- Changed games
	SELECT NEW.card_id, 'games', OLD.games, NEW.games, NEW.change_set_id
		WHERE OLD.games IS NOT DISTINCT FROM NEW.games
	UNION
	-- Changed hand_modifier
	SELECT NEW.card_id, 'hand_modifier', OLD.hand_modifier, NEW.hand_modifier, NEW.change_set_id
		WHERE OLD.hand_modifier IS NOT DISTINCT FROM NEW.hand_modifier
	UNION
	-- Changed highres_image
	SELECT NEW.card_id, 'highres_image', OLD.highres_image::TEXT, NEW.highres_image::TEXT, NEW.change_set_id
		WHERE OLD.highres_image IS NOT DISTINCT FROM NEW.highres_image
	UNION
	-- Changed id
	SELECT NEW.card_id, 'id', CAST(OLD.id AS VARCHAR), CAST(NEW.id AS VARCHAR), NEW.change_set_id
		WHERE OLD.id IS NOT DISTINCT FROM NEW.id
	UNION
	-- Changed image_status
	SELECT NEW.card_id, 'image_status', OLD.image_status, NEW.image_status, NEW.change_set_id
		WHERE OLD.image_status IS NOT DISTINCT FROM NEW.image_status
	UNION
	-- Changed image_uri_art_crop
	SELECT NEW.card_id, 'image_uri_art_crop', OLD.image_uri_art_crop, NEW.image_uri_art_crop, NEW.change_set_id
		WHERE OLD.image_uri_art_crop IS NOT DISTINCT FROM NEW.image_uri_art_crop
	UNION
	-- Changed image_uri_border_crop
	SELECT NEW.card_id, 'image_uri_border_crop', OLD.image_uri_border_crop, NEW.image_uri_border_crop, NEW.change_set_id
		WHERE OLD.image_uri_border_crop IS NOT DISTINCT FROM NEW.image_uri_border_crop
	UNION
	-- Changed image_uri_large
	SELECT NEW.card_id, 'image_uri_large', OLD.image_uri_large, NEW.image_uri_large, NEW.change_set_id
		WHERE OLD.image_uri_large IS NOT DISTINCT FROM NEW.image_uri_large
	UNION
	-- Changed image_uri_normal
	SELECT NEW.card_id, 'image_uri_normal', OLD.image_uri_normal, NEW.image_uri_normal, NEW.change_set_id
		WHERE OLD.image_uri_normal IS NOT DISTINCT FROM NEW.image_uri_normal
	UNION
	-- Changed image_uri_png
	SELECT NEW.card_id, 'image_uri_png', OLD.image_uri_png, NEW.image_uri_png, NEW.change_set_id
		WHERE OLD.image_uri_png IS NOT DISTINCT FROM NEW.image_uri_png
	UNION
	-- Changed image_uri_small
	SELECT NEW.card_id, 'image_uri_small', OLD.image_uri_small, NEW.image_uri_small, NEW.change_set_id
		WHERE OLD.image_uri_small IS NOT DISTINCT FROM NEW.image_uri_small
	UNION
	-- Changed keywords
	SELECT NEW.card_id, 'keywords', OLD.keywords, NEW.keywords, NEW.change_set_id
		WHERE OLD.keywords IS NOT DISTINCT FROM NEW.keywords
	UNION
	-- Changed lang
	SELECT NEW.card_id, 'lang', OLD.lang, NEW.lang, NEW.change_set_id
		WHERE OLD.lang IS NOT DISTINCT FROM NEW.lang
	UNION
	-- Changed layout
	SELECT NEW.card_id, 'layout', OLD.layout, NEW.layout, NEW.change_set_id
		WHERE OLD.layout IS NOT DISTINCT FROM NEW.layout
	UNION
	-- Changed legal_alchemy
	SELECT NEW.card_id, 'legal_alchemy', OLD.legal_alchemy::TEXT, NEW.legal_alchemy::TEXT, NEW.change_set_id
		WHERE OLD.legal_alchemy IS NOT DISTINCT FROM NEW.legal_alchemy
	UNION
	-- Changed legal_brawl
	SELECT NEW.card_id, 'legal_brawl', OLD.legal_brawl::TEXT, NEW.legal_brawl::TEXT, NEW.change_set_id
		WHERE OLD.legal_brawl IS NOT DISTINCT FROM NEW.legal_brawl
	UNION
	-- Changed legal_commander
	SELECT NEW.card_id, 'legal_commander', OLD.legal_commander::TEXT, NEW.legal_commander::TEXT, NEW.change_set_id
		WHERE OLD.legal_commander IS NOT DISTINCT FROM NEW.legal_commander
	UNION
	-- Changed legal_duel
	SELECT NEW.card_id, 'legal_duel', OLD.legal_duel::TEXT, NEW.legal_duel::TEXT, NEW.change_set_id
		WHERE OLD.legal_duel IS NOT DISTINCT FROM NEW.legal_duel
	UNION
	-- Changed legal_future
	SELECT NEW.card_id, 'legal_future', OLD.legal_future::TEXT, NEW.legal_future::TEXT, NEW.change_set_id
		WHERE OLD.legal_future IS NOT DISTINCT FROM NEW.legal_future
	UNION
	-- Changed legal_gladiator
	SELECT NEW.card_id, 'legal_gladiator', OLD.legal_gladiator::TEXT, NEW.legal_gladiator::TEXT, NEW.change_set_id
		WHERE OLD.legal_gladiator IS NOT DISTINCT FROM NEW.legal_gladiator
	UNION
	-- Changed legal_historic
	SELECT NEW.card_id, 'legal_historic', OLD.legal_historic::TEXT, NEW.legal_historic::TEXT, NEW.change_set_id
		WHERE OLD.legal_historic IS NOT DISTINCT FROM NEW.legal_historic
	UNION
	-- Changed legal_legacy
	SELECT NEW.card_id, 'legal_legacy', OLD.legal_legacy::TEXT, NEW.legal_legacy::TEXT, NEW.change_set_id
		WHERE OLD.legal_legacy IS NOT DISTINCT FROM NEW.legal_legacy
	UNION
	-- Changed legal_modern
	SELECT NEW.card_id, 'legal_modern', OLD.legal_modern::TEXT, NEW.legal_modern::TEXT, NEW.change_set_id
		WHERE OLD.legal_modern IS NOT DISTINCT FROM NEW.legal_modern
	UNION
	-- Changed legal_oathbreaker
	SELECT NEW.card_id, 'legal_oathbreaker', OLD.legal_oathbreaker::TEXT, NEW.legal_oathbreaker::TEXT, NEW.change_set_id
		WHERE OLD.legal_oathbreaker IS NOT DISTINCT FROM NEW.legal_oathbreaker
	UNION
	-- Changed legal_oldschool
	SELECT NEW.card_id, 'legal_oldschool', OLD.legal_oldschool::TEXT, NEW.legal_oldschool::TEXT, NEW.change_set_id
		WHERE OLD.legal_oldschool IS NOT DISTINCT FROM NEW.legal_oldschool
	UNION
	-- Changed legal_pauper
	SELECT NEW.card_id, 'legal_pauper', OLD.legal_pauper::TEXT, NEW.legal_pauper::TEXT, NEW.change_set_id
		WHERE OLD.legal_pauper IS NOT DISTINCT FROM NEW.legal_pauper
	UNION
	-- Changed legal_paupercommander
	SELECT NEW.card_id, 'legal_paupercommander', OLD.legal_paupercommander::TEXT, NEW.legal_paupercommander::TEXT, NEW.change_set_id
		WHERE OLD.legal_paupercommander IS NOT DISTINCT FROM NEW.legal_paupercommander
	UNION
	-- Changed legal_penny
	SELECT NEW.card_id, 'legal_penny', OLD.legal_penny::TEXT, NEW.legal_penny::TEXT, NEW.change_set_id
		WHERE OLD.legal_penny IS NOT DISTINCT FROM NEW.legal_penny
	UNION
	-- Changed legal_pioneer
	SELECT NEW.card_id, 'legal_pioneer', OLD.legal_pioneer::TEXT, NEW.legal_pioneer::TEXT, NEW.change_set_id
		WHERE OLD.legal_pioneer IS NOT DISTINCT FROM NEW.legal_pioneer
	UNION
	-- Changed legal_predh
	SELECT NEW.card_id, 'legal_predh', OLD.legal_predh::TEXT, NEW.legal_predh::TEXT, NEW.change_set_id
		WHERE OLD.legal_predh IS NOT DISTINCT FROM NEW.legal_predh
	UNION
	-- Changed legal_premodern
	SELECT NEW.card_id, 'legal_premodern', OLD.legal_premodern::TEXT, NEW.legal_premodern::TEXT, NEW.change_set_id
		WHERE OLD.legal_premodern IS NOT DISTINCT FROM NEW.legal_premodern
	UNION
	-- Changed legal_standard
	SELECT NEW.card_id, 'legal_standard', OLD.legal_standard::TEXT, NEW.legal_standard::TEXT, NEW.change_set_id
		WHERE OLD.legal_standard IS NOT DISTINCT FROM NEW.legal_standard
	UNION
	-- Changed legal_standardbrawl
	SELECT NEW.card_id, 'legal_standardbrawl', OLD.legal_standardbrawl::TEXT, NEW.legal_standardbrawl::TEXT, NEW.change_set_id
		WHERE OLD.legal_standardbrawl IS NOT DISTINCT FROM NEW.legal_standardbrawl
	UNION
	-- Changed legal_timeless
	SELECT NEW.card_id, 'legal_timeless', OLD.legal_timeless::TEXT, NEW.legal_timeless::TEXT, NEW.change_set_id
		WHERE OLD.legal_timeless IS NOT DISTINCT FROM NEW.legal_timeless
	UNION
	-- Changed legal_vintage
	SELECT NEW.card_id, 'legal_vintage', OLD.legal_vintage::TEXT, NEW.legal_vintage::TEXT, NEW.change_set_id
		WHERE OLD.legal_vintage IS NOT DISTINCT FROM NEW.legal_vintage
    UNION
	-- Changed life_modifier
	SELECT NEW.card_id, 'life_modifier', OLD.life_modifier, NEW.life_modifier, NEW.change_set_id
		WHERE OLD.life_modifier IS NOT DISTINCT FROM NEW.life_modifier
    UNION
	-- Changed loyalty
	SELECT NEW.card_id, 'loyalty', OLD.loyalty, NEW.loyalty, NEW.change_set_id
		WHERE OLD.loyalty IS NOT DISTINCT FROM NEW.loyalty
    UNION
	-- Changed mana_cost
	SELECT NEW.card_id, 'mana_cost', OLD.mana_cost, NEW.mana_cost, NEW.change_set_id
		WHERE OLD.mana_cost IS NOT DISTINCT FROM NEW.mana_cost
	UNION
	-- Changed mtgo_id
	SELECT NEW.card_id, 'mtgo_id', CAST(OLD.mtgo_id AS VARCHAR), CAST(NEW.mtgo_id AS VARCHAR), NEW.change_set_id
		WHERE OLD.mtgo_id IS NOT DISTINCT FROM NEW.mtgo_id
    UNION
	-- Changed multiverse_ids
	SELECT NEW.card_id, 'multiverse_ids', OLD.multiverse_ids, NEW.multiverse_ids, NEW.change_set_id
		WHERE OLD.multiverse_ids IS NOT DISTINCT FROM NEW.multiverse_ids
    UNION
	-- Changed name
	SELECT NEW.card_id, 'name', OLD.name, NEW.name, NEW.change_set_id
		WHERE OLD.name IS NOT DISTINCT FROM NEW.name
	UNION
	-- Changed nonfoil
	SELECT NEW.card_id, 'nonfoil', OLD.nonfoil::TEXT, NEW.nonfoil::TEXT, NEW.change_set_id
		WHERE OLD.nonfoil IS NOT DISTINCT FROM NEW.nonfoil
	UNION
	-- Changed oracle_id
	SELECT NEW.card_id, 'oracle_id', CAST(OLD.oracle_id AS VARCHAR), CAST(NEW.oracle_id AS VARCHAR), NEW.change_set_id
		WHERE OLD.oracle_id IS NOT DISTINCT FROM NEW.oracle_id
    UNION
	-- Changed oracle_text
	SELECT NEW.card_id, 'oracle_text', OLD.oracle_text, NEW.oracle_text, NEW.change_set_id
		WHERE OLD.oracle_text IS NOT DISTINCT FROM NEW.oracle_text
	UNION
	-- Changed oversized
	SELECT NEW.card_id, 'oversized', OLD.oversized::TEXT, NEW.oversized::TEXT, NEW.change_set_id
		WHERE OLD.oversized IS NOT DISTINCT FROM NEW.oversized
	UNION
	-- Changed penny_rank
	SELECT NEW.card_id, 'penny_rank', CAST(OLD.penny_rank AS VARCHAR), CAST(NEW.penny_rank AS VARCHAR), NEW.change_set_id
		WHERE OLD.penny_rank IS NOT DISTINCT FROM NEW.penny_rank
    UNION
	-- Changed power
	SELECT NEW.card_id, 'power', OLD.power, NEW.power, NEW.change_set_id
		WHERE OLD.power IS NOT DISTINCT FROM NEW.power
	UNION
	-- Changed preview_date
	SELECT NEW.card_id, 'preview_date', TO_CHAR(OLD.preview_date, 'YYYY-MM-DD'), TO_CHAR(NEW.preview_date, 'YYYY-MM-DD'), NEW.change_set_id
		WHERE OLD.preview_date IS NOT DISTINCT FROM NEW.preview_date
    UNION
	-- Changed preview_source
	SELECT NEW.card_id, 'preview_source', OLD.preview_source, NEW.preview_source, NEW.change_set_id
		WHERE OLD.preview_source IS NOT DISTINCT FROM NEW.preview_source
    UNION
	-- Changed preview_source_uri
	SELECT NEW.card_id, 'preview_source_uri', OLD.preview_source_uri, NEW.preview_source_uri, NEW.change_set_id
		WHERE OLD.preview_source_uri IS NOT DISTINCT FROM NEW.preview_source_uri
	UNION
	-- Changed price_eur
	SELECT NEW.card_id, 'price_eur', CAST(OLD.price_eur AS VARCHAR), CAST(NEW.price_eur AS VARCHAR), NEW.change_set_id
		WHERE OLD.price_eur IS NOT DISTINCT FROM NEW.price_eur
	UNION
	-- Changed price_eur_foil
	SELECT NEW.card_id, 'price_eur_foil', CAST(OLD.price_eur_foil AS VARCHAR), CAST(NEW.price_eur_foil AS VARCHAR), NEW.change_set_id
		WHERE OLD.price_eur_foil IS NOT DISTINCT FROM NEW.price_eur_foil
	UNION
	-- Changed price_tix
	SELECT NEW.card_id, 'price_tix', CAST(OLD.price_tix AS VARCHAR), CAST(NEW.price_tix AS VARCHAR), NEW.change_set_id
		WHERE OLD.price_tix IS NOT DISTINCT FROM NEW.price_tix
	UNION
	-- Changed price_usd
	SELECT NEW.card_id, 'price_usd', CAST(OLD.price_usd AS VARCHAR), CAST(NEW.price_usd AS VARCHAR), NEW.change_set_id
		WHERE OLD.price_usd IS NOT DISTINCT FROM NEW.price_usd
	UNION
	-- Changed price_usd_etched
	SELECT NEW.card_id, 'price_usd_etched', CAST(OLD.price_usd_etched AS VARCHAR), CAST(NEW.price_usd_etched AS VARCHAR), NEW.change_set_id
		WHERE OLD.price_usd_etched IS NOT DISTINCT FROM NEW.price_usd_etched
	UNION
	-- Changed price_usd_foil
	SELECT NEW.card_id, 'price_usd_foil', CAST(OLD.price_usd_foil AS VARCHAR), CAST(NEW.price_usd_foil AS VARCHAR), NEW.change_set_id
		WHERE OLD.price_usd_foil IS NOT DISTINCT FROM NEW.price_usd_foil
    UNION
	-- Changed printed_name
	SELECT NEW.card_id, 'printed_name', OLD.printed_name, NEW.printed_name, NEW.change_set_id
		WHERE OLD.printed_name IS NOT DISTINCT FROM NEW.printed_name
    UNION
	-- Changed printed_text
	SELECT NEW.card_id, 'printed_text', OLD.printed_text, NEW.printed_text, NEW.change_set_id
		WHERE OLD.printed_text IS NOT DISTINCT FROM NEW.printed_text
    UNION
	-- Changed printed_type_line
	SELECT NEW.card_id, 'printed_type_line', OLD.printed_type_line, NEW.printed_type_line, NEW.change_set_id
		WHERE OLD.printed_type_line IS NOT DISTINCT FROM NEW.printed_type_line
    UNION
	-- Changed prints_search_uri
	SELECT NEW.card_id, 'printed_search_uri', OLD.printed_search_uri, NEW.printed_search_uri, NEW.change_set_id
		WHERE OLD.printed_search_uri IS NOT DISTINCT FROM NEW.printed_search_uri
    UNION
	-- Changed produced_mana
	SELECT NEW.card_id, 'produced_mana', OLD.produced_mana, NEW.produced_mana, NEW.change_set_id
		WHERE OLD.produced_mana IS NOT DISTINCT FROM NEW.produced_mana
	UNION
	-- Changed promo
	SELECT NEW.card_id, 'promo', OLD.promo::TEXT, NEW.promo::TEXT, NEW.change_set_id
		WHERE OLD.promo IS NOT DISTINCT FROM NEW.promo
    UNION
	-- Changed purchase_cardhoarder
	SELECT NEW.card_id, 'purchase_cardhoarder', OLD.purchase_cardhoarder, NEW.purchase_cardhoarder, NEW.change_set_id
		WHERE OLD.purchase_cardhoarder IS NOT DISTINCT FROM NEW.purchase_cardhoarder
    UNION
	-- Changed purchase_cardmarket
	SELECT NEW.card_id, 'purchase_cardmarket', OLD.purchase_cardmarket, NEW.purchase_cardmarket, NEW.change_set_id
		WHERE OLD.purchase_cardmarket IS NOT DISTINCT FROM NEW.purchase_cardmarket
    UNION
	-- Changed purchase_tcgplayer
	SELECT NEW.card_id, 'purchase_tcgplayer', OLD.purchase_tcgplayer, NEW.purchase_tcgplayer, NEW.change_set_id
		WHERE OLD.purchase_tcgplayer IS NOT DISTINCT FROM NEW.purchase_tcgplayer
    UNION
	-- Changed rarity
	SELECT NEW.card_id, 'rarity', OLD.rarity, NEW.rarity, NEW.change_set_id
		WHERE OLD.rarity IS NOT DISTINCT FROM NEW.rarity
	UNION
	-- Changed released_at
	SELECT NEW.card_id, 'released_at', TO_CHAR(OLD.released_at, 'YYYY-MM-DD'), TO_CHAR(NEW.released_at, 'YYYY-MM-DD'), NEW.change_set_id
		WHERE OLD.released_at IS NOT DISTINCT FROM NEW.released_at
	UNION
	-- Changed reprint
	SELECT NEW.card_id, 'reprint', OLD.reprint::TEXT, NEW.reprint::TEXT, NEW.change_set_id
		WHERE OLD.reprint IS NOT DISTINCT FROM NEW.reprint
	UNION
	-- Changed reserved
	SELECT NEW.card_id, 'reserved', OLD.reserved::TEXT, NEW.reserved::TEXT, NEW.change_set_id
		WHERE OLD.reserved IS NOT DISTINCT FROM NEW.reserved
    UNION
	-- Changed rulings_uri
	SELECT NEW.card_id, 'rulings_uri', OLD.rulings_uri, NEW.rulings_uri, NEW.change_set_id
		WHERE OLD.rulings_uri IS NOT DISTINCT FROM NEW.rulings_uri
    UNION
	-- Changed scryfall_set_uri
	SELECT NEW.card_id, 'scryfall_set_uri', OLD.scryfall_set_uri, NEW.scryfall_set_uri, NEW.change_set_id
		WHERE OLD.scryfall_set_uri IS NOT DISTINCT FROM NEW.scryfall_set_uri
    UNION
	-- Changed scryfall_uri
	SELECT NEW.card_id, 'scryfall_uri', OLD.scryfall_uri, NEW.scryfall_uri, NEW.change_set_id
		WHERE OLD.scryfall_uri IS NOT DISTINCT FROM NEW.scryfall_uri
    UNION
	-- Changed security_stamp
	SELECT NEW.card_id, 'security_stamp', OLD.security_stamp, NEW.security_stamp, NEW.change_set_id
		WHERE OLD.security_stamp IS NOT DISTINCT FROM NEW.security_stamp
    UNION
	-- Changed set
	SELECT NEW.card_id, 'set', OLD.set, NEW.set, NEW.change_set_id
		WHERE OLD.set IS NOT DISTINCT FROM NEW.set
	UNION
	-- Changed set_id
	SELECT NEW.card_id, 'set_id', CAST(OLD.set_id AS VARCHAR), CAST(NEW.set_id AS VARCHAR), NEW.change_set_id
		WHERE OLD.set_id IS NOT DISTINCT FROM NEW.set_id
    UNION
	-- Changed set_name
	SELECT NEW.card_id, 'set_name', OLD.set_name, NEW.set_name, NEW.change_set_id
		WHERE OLD.set_name IS NOT DISTINCT FROM NEW.set_name
    UNION
	-- Changed set_search_uri
	SELECT NEW.card_id, 'set_search_uri', OLD.set_search_uri, NEW.set_search_uri, NEW.change_set_id
		WHERE OLD.set_search_uri IS NOT DISTINCT FROM NEW.set_search_uri
    UNION
	-- Changed set_type
	SELECT NEW.card_id, 'set_type', OLD.set_type, NEW.set_type, NEW.change_set_id
		WHERE OLD.set_type IS NOT DISTINCT FROM NEW.set_type
    UNION
	-- Changed set_uri
	SELECT NEW.card_id, 'set_uri', OLD.set_uri, NEW.set_uri, NEW.change_set_id
		WHERE OLD.set_uri IS NOT DISTINCT FROM NEW.set_uri
	UNION
	-- Changed story_spotlight
	SELECT NEW.card_id, 'story_spotlight', OLD.story_spotlight::TEXT, NEW.story_spotlight::TEXT, NEW.change_set_id
		WHERE OLD.story_spotlight IS NOT DISTINCT FROM NEW.story_spotlight
	UNION
	-- Changed tcgplayer_id
	SELECT NEW.card_id, 'tcgplayer_id', CAST(OLD.tcgplayer_id AS VARCHAR), CAST(NEW.tcgplayer_id AS VARCHAR), NEW.change_set_id
		WHERE OLD.tcgplayer_id IS NOT DISTINCT FROM NEW.tcgplayer_id
	UNION
	-- Changed textless
	SELECT NEW.card_id, 'textless', OLD.textless::TEXT, NEW.textless::TEXT, NEW.change_set_id
		WHERE OLD.textless IS NOT DISTINCT FROM NEW.textless
    UNION
	-- Changed toughness
	SELECT NEW.card_id, 'toughness', OLD.toughness, NEW.toughness, NEW.change_set_id
		WHERE OLD.toughness IS NOT DISTINCT FROM NEW.toughness
    UNION
	-- Changed type_line
	SELECT NEW.card_id, 'type_line', OLD.type_line, NEW.type_line, NEW.change_set_id
		WHERE OLD.type_line IS NOT DISTINCT FROM NEW.type_line
    UNION
	-- Changed uri
	SELECT NEW.card_id, 'uri', OLD.uri, NEW.uri, NEW.change_set_id
		WHERE OLD.uri IS NOT DISTINCT FROM NEW.uri
    UNION
	-- Changed uri_edhrec
	SELECT NEW.card_id, 'uri_edhrec', OLD.uri_edhrec, NEW.uri_edhrec, NEW.change_set_id
		WHERE OLD.uri_edhrec IS NOT DISTINCT FROM NEW.uri_edhrec
    UNION
	-- Changed uri_gatherer
	SELECT NEW.card_id, 'uri_gatherer', OLD.uri_gatherer, NEW.uri_gatherer, NEW.change_set_id
		WHERE OLD.uri_gatherer IS NOT DISTINCT FROM NEW.uri_gatherer
    UNION
	-- Changed uri_tcgplayer_infinite_articles
	SELECT NEW.card_id, 'uri_tcgplayer_infinite_articles', OLD.uri_tcgplayer_infinite_articles, NEW.uri_tcgplayer_infinite_articles, NEW.change_set_id
		WHERE OLD.uri_tcgplayer_infinite_articles IS NOT DISTINCT FROM NEW.uri_tcgplayer_infinite_articles
    UNION
	-- Changed uri_tcgplayer_infinite_decks
	SELECT NEW.card_id, 'uri_tcgplayer_infinite_decks', OLD.uri_tcgplayer_infinite_decks, NEW.uri_tcgplayer_infinite_decks, NEW.change_set_id
		WHERE OLD.uri_tcgplayer_infinite_decks IS NOT DISTINCT FROM NEW.uri_tcgplayer_infinite_decks
	UNION
	-- Changed variation
	SELECT NEW.card_id, 'variation', OLD.variation::TEXT, NEW.variation::TEXT, NEW.change_set_id
		WHERE OLD.variation IS NOT DISTINCT FROM NEW.variation
    UNION
	-- Changed active
	SELECT NEW.card_id, 'active', OLD.active::TEXT, NEW.active::TEXT, NEW.change_set_id
		WHERE OLD.active IS NOT DISTINCT FROM NEW.active
    ;
    
    RETURN NEW;
END;
$$ LANGUAGE plpgsql
;

CREATE TRIGGER TRI_before_insert_TCG_MTG_Card
    BEFORE INSERT ON tcg.public.TCG_MTG_Card
    FOR EACH ROW
    EXECUTE FUNCTION tcg.public.FN_before_insert_TCG_MTG_Card()
;
CREATE TRIGGER TRI_before_update_TCG_MTG_Card
    BEFORE UPDATE ON tcg.public.TCG_MTG_Card
    FOR EACH ROW
    EXECUTE FUNCTION tcg.public.FN_before_update_TCG_MTG_Card()
;