I'm trying to create trigger in PostgreSQL 14:
create or replace function add_stats_to_player() returns trigger as $add_stats_to_player$
declare
equipment_id int := new.player_equipment_armor['armor_id'];
equipment_stats varchar[] := array(select jsonb_object_keys(armor_stats['stats']) from equipments_armor where armor_id = equipment_id);
equipment_stat varchar;
begin
raise notice '%', equipment_id;
foreach equipment_stat in array equipment_stats loop
if old.player_equipment_armor['stats'][equipment_stat] is not null then
update players set equipment_stat = equipment_stat - old.player_equipment_armor['stats'][equipment_stat] + new.player_equipment_armor['stats'][equipment_stat] where player_id = new.player_id;
end if;
end loop;
return new;
END;
$add_stats_to_player$ language plpgsql;
create trigger add_stats_to_player after insert or update of player_equipment_armor on players
for each row WHEN (pg_trigger_depth() < 1) execute function add_stats_to_player();
Can I make a column name from the variable equipment_stat
, or is that a bad idea?
**update**
Here's how I did it
create or replace function add_stats_to_player() returns trigger as $add_stats_to_player$
declare
equipment_id int := new.player_equipment_armor['armor_id'];
equipment_stats varchar[] := array(select jsonb_object_keys(armor_stats['stats']) from equipments_armor where armor_id = equipment_id);
equipment_stat varchar;
begin
if (TG_OP = 'UPDATE') then
foreach equipment_stat in array equipment_stats loop
if old.player_equipment_armor['stats'][equipment_stat] is not null then
execute 'update players set ' || equipment_stat || ' = ' || equipment_stat || ' - ' || old.player_equipment_armor['stats'][equipment_stat] || '+' || new.player_equipment_armor['stats'][equipment_stat] || ' where player_id = ' || new.player_id;
else
execute 'update players set ' || equipment_stat || ' = ' || new.player_equipment_armor['stats'][equipment_stat] || ' where player_id = ' || new.player_id;
end if;
end loop;
elseif (TG_OP = 'INSERT') then
foreach equipment_stat in array equipment_stats loop
execute 'update players set ' || equipment_stat || ' = ' || new.player_equipment_armor['stats'][equipment_stat] || ' where player_id = ' || new.player_id;
end loop;
end if;
return new;
end;
$add_stats_to_player$ language plpgsql;
create trigger add_stats_to_player after insert or update of player_equipment_armor on players
for each row WHEN (pg_trigger_depth() < 1) execute procedure add_stats_to_player();
Asked by Sevas
(11 rep)
May 7, 2022, 01:34 PM
Last activity: May 9, 2025, 07:04 PM
Last activity: May 9, 2025, 07:04 PM