PostgreSQL INNER JOIN
0 likes • Oct 15, 2022
PostgreSQL
Loading...
More PostgreSQL Posts
-- on-line documentation of PostgresQL triggers:-- https://www.postgresql.org/docs/9.1/sql-createtrigger.html-- executes as rps programmer\pset pager off/*A database trigger is procedural code that is automaticallyexecuted in response to certain events on a particular tableor view in a database. The trigger is mostly used for maintainingthe integrity of the information on the database.CREATE TRIGGER fooTriggerON tableName[AFTER/ (BEFORE/INSTEAD OF) ] [INSERT/UNPDATE/DELETE]do something*/CREATE OR REPLACE FUNCTION prohibitDeleteOnlog()RETURNS TRIGGERLANGUAGE PLPGSQL AS $$BEGINRAISE NOTICE 'Delete Prohibited';INSERT INTO tblPlayersLog(pl_id, pl_time, pl_user, TG_OP,p_id_OLD, p_id_NEW)VALUES( NEXTVAL('rpsSequence'), CURRENT_TIMESTAMP,CURRENT_USER, TG_OP, NULL, NULL);RETURN NULL; -- Log the attempt and abort.END $$;-- --------------------------------- CREATE OR REPLACE TRIGGER is not implementedDROP TRIGGER IF EXISTS preventDeleteOnlog ON tblPlayersLog;CREATE TRIGGER preventDeleteOnlogBEFORE DELETE ON tblPlayersLogFOR EACH ROWEXECUTE PROCEDURE prohibitDeleteOnlog();-- test it -----------------------/*DELETE FROM tblRounds WHERE r_id=8;*/-- -------------------------------CREATE OR REPLACE FUNCTION logChangesOnRounds()RETURNS TRIGGERLANGUAGE PLPGSQL AS $$BEGINRAISE NOTICE 'Change Logged on tblRounds.';INSERT INTO tblPlayersLog(pl_id, pl_time, pl_user, TG_OP,p_id_OLD, p_id_NEW)VALUES( NEXTVAL('rpsSequence'), CURRENT_TIMESTAMP,CURRENT_USER, TG_OP, NULL, NULL);RETURN NEW; -- allow update to proceedEND $$;-- -------------------------------DROP TRIGGER IF EXISTS ChangesOnRounds;CREATE TRIGGER ChangesOnRoundsBEFORE UPDATE ON tblRoundsFOR EACH ROWEXECUTE PROCEDURE logChangesOnRounds();-- --------------------------------/*UPDATE tblRoundsSET r_token2='P'WHERE r_id=8;*/-- -----------------------------CREATE OR REPLACE FUNCTION AlterDeleteOnPlayers()RETURNS TRIGGERLANGUAGE PLPGSQL AS $$BEGINRAISE NOTICE 'Delete on Players.';UPDATE tblPlayersSET p_active = FALSEWHERE OLD.p_id = p_id;RETURN NULL;END $$;-- -------------------------------Implement a trigger that will intercept DELETE on the tblPlayers table and, BEFORE deleting the record, will set the p_active field to FALSE.DROP TRIGGER IF EXISTS DeleteOnPlayers;CREATE TRIGGER DeleteOnPlayersBEFORE DELETE ON tblPlayersFOR EACH ROWEXECUTE PROCEDURE AlterDeleteOnPlayers();--Implement two triggers that will block DELETE on tblGames and tblRounds respectively.CREATE OR REPLACE FUNCTION AlterDeleteOnTblGames()RETURNS TRIGGERLANGUAGE PLPGSQL AS $$BEGINRAISE NOTICE 'not deleting object from tblGames.';RETURN NULL;END $$;DROP TRIGGER IF EXISTS blockDeleteOnGames;CREATE TRIGGER blockDeleteOnGamesBEFORE DELETE ON tblGamesFOR EACH ROWEXECUTE PROCEDURE AlterDeleteOnTblGames();CREATE OR REPLACE FUNCTION AlterDeleteOnTblRounds()RETURNS TRIGGERLANGUAGE PLPGSQL AS $$BEGINRAISE NOTICE 'not deleting object from tblRounds.';RETURN NULL;END $$;DROP TRIGGER IF EXISTS blockDeleteOnRounds;CREATE TRIGGER blockDeleteOnRoundsBEFORE DELETE ON tblRoundsFOR EACH ROWEXECUTE PROCEDURE AlterDeleteOnTblRounds();--Implement a trigger that will log updates on tblGames. (You will create the log table as demonstrated in the notes.)CREATE OR REPLACE FUNCTION logChangesOnTblGames()RETURNS TRIGGERLANGUAGE PLPGSQL AS $$BEGINRAISE NOTICE 'Change Logged on tblGames.';CREATE IF NOT EXISTS tblPlayersLog(pl_id SERIAL PRIMARY KEY, pl_time TIMESTAMP, pl_user VARCHAR(50), TG_OP VARCHAR(10), g_id_OLD INTEGER, g_id_NEW INTEGER);INSERT INTO tblPlayersLog(pl_id, pl_time, pl_user, TG_OP,p_id_OLD, p_id_NEW)VALUES( NEXTVAL('rpsSequence'), CURRENT_TIMESTAMP,CURRENT_USER, TG_OP, NULL, NULL);RETURN NEW; -- allow update to proceedEND $$;DROP TRIGGER IF EXISTS ChangesOnTblGames;CREATE TRIGGER ChangesOnTblGamesBEFORE UPDATE ON tblGamesFOR EACH ROWEXECUTE PROCEDURE logChangesOnTblGames();