|
/*
|
|
OP_Code для PH_HISTORY
|
|
0 - ph updated
|
|
1 - ph deleted
|
|
2 - ph inserted
|
|
3 - attrval deleted
|
|
4 - attrval inserted
|
|
*/
|
|
|
|
CREATE OR REPLACE FUNCTION AddUpdatedPh_to_PhHistory() RETURNS TRIGGER AS
|
|
$$
|
|
BEGIN
|
|
-- триггер фильтруется и смотрит только на эти поля, если добавляем тут, то и в вызывающую функцию тоже:
|
|
IF (OLD.name IS DISTINCT FROM NEW.name) THEN
|
|
INSERT INTO PH_HISTORY (PH_ID, Name, Value) VALUES (new.id, 'Name', new.name);
|
|
END IF;
|
|
IF (OLD.filename IS DISTINCT FROM NEW.filename) THEN
|
|
INSERT INTO PH_HISTORY (PH_ID, Name, Value) VALUES (new.id, 'FileName', new.filename);
|
|
END IF;
|
|
IF (OLD.duration IS DISTINCT FROM NEW.duration) THEN
|
|
INSERT INTO PH_HISTORY (PH_ID, Name, Value) VALUES (new.id, 'Duration', new.duration);
|
|
END IF;
|
|
IF (OLD.type IS DISTINCT FROM NEW.type) THEN
|
|
INSERT INTO PH_HISTORY (PH_ID, Name, Value) VALUES (new.id, 'Type', new.type);
|
|
END IF;
|
|
IF (OLD.intro IS DISTINCT FROM NEW.intro) THEN
|
|
INSERT INTO PH_HISTORY (PH_ID, Name, Value) VALUES (new.id, 'Intro', new.intro);
|
|
END IF;
|
|
IF (OLD.outro IS DISTINCT FROM NEW.outro) THEN
|
|
INSERT INTO PH_HISTORY (PH_ID, Name, Value) VALUES (new.id, 'Outro', new.outro);
|
|
END IF;
|
|
IF (OLD.fadein IS DISTINCT FROM NEW.fadein) THEN
|
|
INSERT INTO PH_HISTORY (PH_ID, Name, Value) VALUES (new.id, 'FadeIn', new.fadein);
|
|
END IF;
|
|
IF (OLD.fadeout IS DISTINCT FROM NEW.fadeout) THEN
|
|
INSERT INTO PH_HISTORY (PH_ID, Name, Value) VALUES (new.id, 'FadeOut', new.fadeout);
|
|
END IF;
|
|
IF (OLD.startnext IS DISTINCT FROM NEW.startnext) THEN
|
|
INSERT INTO PH_HISTORY (PH_ID, Name, Value) VALUES (new.id, 'StartNext', new.startnext);
|
|
END IF;
|
|
IF (OLD.ph_start IS DISTINCT FROM NEW.ph_start) THEN
|
|
INSERT INTO PH_HISTORY (PH_ID, Name, Value) VALUES (new.id, 'Ph_Start', new.ph_start);
|
|
END IF;
|
|
IF (OLD.ph_stop IS DISTINCT FROM NEW.ph_stop) THEN
|
|
INSERT INTO PH_HISTORY (PH_ID, Name, Value) VALUES (new.id, 'Ph_Stop', new.ph_stop);
|
|
END IF;
|
|
IF (OLD.cmd IS DISTINCT FROM NEW.cmd) THEN
|
|
INSERT INTO PH_HISTORY (PH_ID, Name, Value) VALUES (new.id, 'Cmd', new.cmd);
|
|
END IF;
|
|
IF (OLD.freq IS DISTINCT FROM NEW.freq) THEN
|
|
INSERT INTO PH_HISTORY (PH_ID, Name, Value) VALUES (new.id, 'Freq', new.freq);
|
|
END IF;
|
|
IF (OLD.smplsize IS DISTINCT FROM NEW.smplsize) THEN
|
|
INSERT INTO PH_HISTORY (PH_ID, Name, Value) VALUES (new.id, 'SmplSize', new.smplsize);
|
|
END IF;
|
|
IF (OLD.radioid IS DISTINCT FROM NEW.radioid) THEN
|
|
INSERT INTO PH_HISTORY (PH_ID, Name, Value) VALUES (new.id, 'RadioID', new.radioid);
|
|
END IF;
|
|
IF (OLD.deleted IS DISTINCT FROM NEW.deleted) THEN
|
|
INSERT INTO PH_HISTORY (PH_ID, Name, Value) VALUES (new.id, 'Deleted', new.deleted);
|
|
END IF;
|
|
IF (OLD.id_number IS DISTINCT FROM NEW.id_number) THEN
|
|
INSERT INTO PH_HISTORY (PH_ID, Name, Value) VALUES (new.id, 'ID_Number', new.id_number);
|
|
END IF;
|
|
IF (OLD.modifyft IS DISTINCT FROM NEW.modifyft) THEN
|
|
INSERT INTO PH_HISTORY (PH_ID, Name, Value) VALUES (new.id, 'ModifyFT', new.modifyft);
|
|
END IF;
|
|
IF (OLD.ddb_owner IS DISTINCT FROM NEW.ddb_owner) THEN
|
|
INSERT INTO PH_HISTORY (PH_ID, Name, Value) VALUES (new.id, 'DDB_Owner', new.ddb_owner);
|
|
END IF;
|
|
IF (OLD.version IS DISTINCT FROM NEW.version) THEN
|
|
INSERT INTO PH_HISTORY (PH_ID, Name, Value) VALUES (new.id, 'Version', new.version);
|
|
END IF;
|
|
IF (OLD.ddb_id IS DISTINCT FROM NEW.ddb_id) THEN
|
|
INSERT INTO PH_HISTORY (PH_ID, Name, Value) VALUES (new.id, 'DDB_ID', new.ddb_id);
|
|
END IF;
|
|
IF (OLD.intro2 IS DISTINCT FROM NEW.intro2) THEN
|
|
INSERT INTO PH_HISTORY (PH_ID, Name, Value) VALUES (new.id, 'Intro2', new.intro2);
|
|
END IF;
|
|
IF (OLD.intro3 IS DISTINCT FROM NEW.intro3) THEN
|
|
INSERT INTO PH_HISTORY (PH_ID, Name, Value) VALUES (new.id, 'Intro3', new.intro3);
|
|
END IF;
|
|
IF (OLD.startthis IS DISTINCT FROM NEW.startthis) THEN
|
|
INSERT INTO PH_HISTORY (PH_ID, Name, Value) VALUES (new.id, 'StartThis', new.startthis);
|
|
END IF;
|
|
IF (OLD.archive IS DISTINCT FROM NEW.archive) THEN
|
|
INSERT INTO PH_HISTORY (PH_ID, Name, Value) VALUES (new.id, 'Archive', new.archive);
|
|
END IF;
|
|
IF (OLD.readyonair IS DISTINCT FROM NEW.readyonair) THEN
|
|
INSERT INTO PH_HISTORY (PH_ID, Name, Value) VALUES (new.id, 'ReadyOnAir', new.readyonair);
|
|
END IF;
|
|
IF (OLD.lccode IS DISTINCT FROM NEW.lccode) THEN
|
|
INSERT INTO PH_HISTORY (PH_ID, Name, Value) VALUES (new.id, 'LcCode', new.lccode);
|
|
END IF;
|
|
IF (OLD.publisher IS DISTINCT FROM NEW.publisher) THEN
|
|
INSERT INTO PH_HISTORY (PH_ID, Name, Value) VALUES (new.id, 'Publisher', new.publisher);
|
|
END IF;
|
|
IF (OLD.cmd2 IS DISTINCT FROM NEW.cmd2) THEN
|
|
INSERT INTO PH_HISTORY (PH_ID, Name, Value) VALUES (new.id, 'Cmd2', new.cmd2);
|
|
END IF;
|
|
IF (OLD.textsizems IS DISTINCT FROM NEW.textsizems) THEN
|
|
INSERT INTO PH_HISTORY (PH_ID, Name, Value) VALUES (new.id, 'TextSizeMs', new.textsizems);
|
|
END IF;
|
|
IF (OLD.phonotype IS DISTINCT FROM NEW.phonotype) THEN
|
|
INSERT INTO PH_HISTORY (PH_ID, Name, Value) VALUES (new.id, 'PhonoType', new.phonotype);
|
|
END IF;
|
|
|
|
RETURN NEW;
|
|
END;
|
|
$$ LANGUAGE plpgsql;
|
|
|
|
CREATE OR REPLACE FUNCTION AddDeletedPh_to_PhHistory() RETURNS TRIGGER AS
|
|
$$
|
|
BEGIN
|
|
INSERT INTO PH_HISTORY (PH_ID, OP_Code) VALUES (old.id, 1);
|
|
|
|
RETURN NEW;
|
|
END;
|
|
$$ LANGUAGE plpgsql;
|
|
|
|
CREATE OR REPLACE FUNCTION AddInsertedPh_to_PhHistory() RETURNS TRIGGER AS
|
|
$$
|
|
BEGIN
|
|
INSERT INTO PH_HISTORY (PH_ID, OP_Code, Name, Value) VALUES (new.id, 2, 'Type', new.Type);
|
|
INSERT INTO PH_HISTORY (PH_ID, OP_Code, Name, Value) VALUES (new.id, 2, 'Name', new.Name);
|
|
INSERT INTO PH_HISTORY (PH_ID, OP_Code, Name, Value) VALUES (new.id, 2, 'FileName', new.FileName);
|
|
INSERT INTO PH_HISTORY (PH_ID, OP_Code, Name, Value) VALUES (new.id, 2, 'ID_Number', new.ID_Number);
|
|
|
|
RETURN NEW;
|
|
END;
|
|
$$ LANGUAGE plpgsql;
|
|
|
|
CREATE OR REPLACE FUNCTION AddDeletedAttribute_to_PhHistory() RETURNS TRIGGER AS
|
|
$$
|
|
BEGIN
|
|
INSERT INTO PH_HISTORY (PH_ID, OP_Code, AttrVal_ID) VALUES (old.ph_id, 3, old.attrval_id);
|
|
|
|
RETURN NEW;
|
|
END;
|
|
$$ LANGUAGE plpgsql;
|
|
|
|
CREATE OR REPLACE FUNCTION AddInsertedAttribute_to_PhHistory() RETURNS TRIGGER AS
|
|
$$
|
|
BEGIN
|
|
INSERT INTO PH_HISTORY (PH_ID, OP_Code, AttrVal_ID) VALUES (new.ph_id, 4, new.attrval_id);
|
|
|
|
RETURN NEW;
|
|
END;
|
|
$$ LANGUAGE plpgsql;
|
|
|
|
DO
|
|
$$
|
|
DECLARE
|
|
ver int := 3;
|
|
|
|
BEGIN
|
|
|
|
IF EXISTS (SELECT FROM pg_tables WHERE schemaname = 'public' AND tablename = 'components')
|
|
THEN
|
|
IF EXISTS (SELECT veri FROM public.components WHERE name = 'mdb.ph_history' AND veri >= ver)
|
|
THEN
|
|
RAISE NOTICE 'Current PH_HISTORY version is equal or higher than %', ver;
|
|
RETURN;
|
|
END IF;
|
|
ELSE
|
|
RAISE NOTICE 'Components table not found. Script exit';
|
|
RETURN;
|
|
END IF;
|
|
|
|
RAISE NOTICE 'Script begin';
|
|
|
|
DROP TABLE IF EXISTS PH_HISTORY CASCADE;
|
|
|
|
CREATE TABLE PH_HISTORY
|
|
(
|
|
"id" SERIAL NOT NULL
|
|
CONSTRAINT PK_hystory PRIMARY KEY,
|
|
"username" varchar(50) NULL
|
|
CONSTRAINT DF_hystory_UserName DEFAULT (current_user),
|
|
"hostname" varchar(50) NULL
|
|
CONSTRAINT DF_hystory_HostName DEFAULT (inet_server_addr()),
|
|
"modifydate" timestamptz NOT NULL
|
|
CONSTRAINT DF_hystory_ModifyDate DEFAULT (now()),
|
|
"op_code" smallint NOT NULL
|
|
CONSTRAINT DF_hystory_OP_Code DEFAULT ((0)),
|
|
"ph_id" int NOT NULL,
|
|
"name" varchar(50) NULL,
|
|
"value" text NULL,
|
|
"attrval_id" int NULL
|
|
);
|
|
|
|
DROP TRIGGER IF EXISTS History_Updated ON PH;
|
|
-- Тут в MS портянка с курсором ! (не совсем понятно зачем)
|
|
CREATE TRIGGER History_Updated
|
|
AFTER UPDATE OF
|
|
-- триггер будет работать только для указанных в запросе полей, если добавляем тут, то и в триггер тоже:
|
|
name, filename, duration, type, intro, outro, fadein, fadeout, startnext, ph_start, ph_stop, cmd, freq,
|
|
smplsize, radioid, deleted, id_number, modifyft, ddb_owner, version, ddb_id, intro2, intro3, startthis,
|
|
archive, readyonair, lccode, publisher, cmd2, textsizems, phonotype
|
|
ON PH
|
|
FOR EACH ROW
|
|
EXECUTE PROCEDURE AddUpdatedPh_to_PhHistory();
|
|
RAISE NOTICE 'Created: TRIGGER History_Updated';
|
|
|
|
DROP TRIGGER IF EXISTS History_Deleted ON PH;
|
|
CREATE TRIGGER History_Deleted
|
|
AFTER DELETE
|
|
ON PH
|
|
FOR EACH ROW
|
|
EXECUTE PROCEDURE AddDeletedPh_to_PhHistory();
|
|
RAISE NOTICE 'Created: TRIGGER History_Deleted';
|
|
|
|
DROP TRIGGER IF EXISTS History_Inserted ON PH;
|
|
CREATE TRIGGER History_Inserted
|
|
AFTER INSERT
|
|
ON PH
|
|
FOR EACH ROW
|
|
EXECUTE PROCEDURE AddInsertedPh_to_PhHistory();
|
|
RAISE NOTICE 'Created: TRIGGER History_Inserted';
|
|
|
|
DROP TRIGGER IF EXISTS History_Attr_Deleted ON PH_TO_ATTRVALS;
|
|
CREATE TRIGGER History_Attr_Deleted
|
|
AFTER DELETE
|
|
ON PH_TO_ATTRVALS
|
|
FOR EACH ROW
|
|
EXECUTE PROCEDURE AddDeletedAttribute_to_PhHistory();
|
|
RAISE NOTICE 'Created: TRIGGER History_Attr_Deleted';
|
|
|
|
DROP TRIGGER IF EXISTS History_Attr_Inserted ON PH_TO_ATTRVALS;
|
|
CREATE TRIGGER History_Attr_Inserted
|
|
AFTER INSERT
|
|
ON PH_TO_ATTRVALS
|
|
FOR EACH ROW
|
|
EXECUTE PROCEDURE AddInsertedAttribute_to_PhHistory();
|
|
RAISE NOTICE 'Created: TRIGGER History_Attr_Inserted';
|
|
|
|
IF EXISTS (SELECT veri FROM public.components WHERE name = 'mdb.ph_history')
|
|
THEN
|
|
UPDATE public.components set veri = ver WHERE name = 'mdb.ph_history';
|
|
ELSE
|
|
INSERT INTO public.components (name, vers, veri) VALUES ('mdb.ph_history', '', ver);
|
|
END IF;
|
|
|
|
RAISE NOTICE 'Script end!';
|
|
END;
|
|
$$;
|