Trabalho Sobre Trigger
Por: Wyll Machado • 23/6/2016 • Trabalho acadêmico • 472 Palavras (2 Páginas) • 377 Visualizações
A.Verificar se tr_sal_emp.SAL é inferior ou igual ao maior salário permitido para
um funcionário (emp.maxSal)
create or replace function verifica_salario() returns trigger as
$$
declare
_max_salario record;
_atual_salario record;
begin
select * into _max_salario from tr_emp where idemp=new.idemp;
select * into _atual_salario from tr_sal_emp where idemp=new.idemp;
if _atual_salario.sal >= _max_salario.max_sal THEN
RAISE EXCEPTION 'salario Atual nao pode ser maior que o limite';
end if;
return new;
end
$$language plpgsql
CREATE TRIGGER verifica_salario_tr after INSERT OR UPDATE ON tr_sal_emp
FOR EACH ROW EXECUTE PROCEDURE verifica_salario();
B.Não entendi o que vc quer :(
C.Se for uma inclusão com data de início posterior a dezembro de 2010 a data de
fim NÃO pode ser preenchida; Porém, se a data de início informada for inferior a
Janeiro de 2012 e o empregado possuir os códigos 10, 20 ou 30 então a data de
fim deverá ser igual a 31/12/2012.
CREATE OR REPLACE FUNCTION verifica_data_inicio()RETURNS trigger AS
$$
declare
_data_inicio tr_sal_emp%ROWTYPE;
BEGIN
SELECT * INTO _data_inicio FROM tr_sal_emp WHERE idemp=new.idemp;
IF _data_inicio.dtini > '20101231' THEN
UPDATE tr_sal_emp SET dtfim=null WHERE idsal_emp=new.idsal_emp;
RAISE NOTICE 'data fim é nulo ';
END IF;
IF _data_inicio.dtini < '20120101' and _data_inicio.idemp=10 or _data_inicio.idemp=20 or _data_inicio.idemp=30 THEN
UPDATE tr_sal_emp SET dtfim='20121231' WHERE idsal_emp=new.idsal_emp;
RAISE NOTICE 'data fim é 2012-12-31 ';
END IF;
RETURN new;
END;
$$
LANGUAGE plpgsql
CREATE TRIGGER verifica_data_inicio_tr AFTER INSERT ON tr_sal_emp
FOR EACH ROW EXECUTE PROCEDURE verifica_data_inicio();
D.Preencher automaticamente os campos (dependendo da operação):
–usu_inc / usu_atu := current_user
–dth_inc / dth_atu:= current_timestamp
CREATE OR REPLACE FUNCTION completa_user_insert() RETURNS trigger AS
$$
BEGIN
UPDATE tr_emp SET dth_inc=current_timestamp, usu_inc=current_user WHERE idemp=new.idemp;
RETURN new;
END;
$$LANGUAGE plpgsql
CREATE TRIGGER completa_user_insert_tr AFTER INSERT ON tr_emp
FOR EACH ROW EXECUTE PROCEDURE completa_user_insert();
CREATE OR REPLACE FUNCTION completa_user_update() RETURNS trigger AS
$$
BEGIN
DELETE FROM tr_emp WHERE idemp=old.idemp;
INSERT INTO tr_emp VALUES(old.idemp, new.nome, new.maxsal, new.dth_inc, new.usu_inc, current_timestamp, current_user );
RETURN null;
END;
$$LANGUAGE plpgsql
CREATE TRIGGER completa_user_update_tr after UPDATE ON tr_emp
FOR EACH ROW EXECUTE PROCEDURE completa_user_update();
E.Quando um funcionário receba aumento, ou seja, um novo registro é inserido na
tabela TR_SAL_EMP automaticamente um registro deve ser incluído na tabela
TR_PROMOVIDO (ou atualizado, se já existir).
CREATE OR REPLACE FUNCTION log_salario() RETURNS trigger AS
$$
DECLARE
_result record;
_sal_antigo decimal(9,2);
_sal_novo decimal(9,2);
BEGIN
select * into _result from tr_promovido WHERE anomes=old.idsal_emp;
_sal_antigo:=old.sal;
...