Jump to content
Fórum Script Brasil
  • 0

Triggers


Josieli
 Share

Question

Boa tarde

Estou fazendo a matéria de banco de dados 2, e o professor passou um exemplo bem por cima de como criar trigger e porque usa-la, mas agora tentando criar sozinha para o trabalho, estou batendo cabeça com uma delas e gostaria de ajuda.

Tenho as tabelas cidade e estado, e quero que quando um estado não esteja sendo referenciado por nenhuma cidade o mesmo seja excluido, mas a única coisa que consegui seguindo o exemplo que o professor passou é apagar praticamente tudo que foi inserido, ficando apenas o estado que não foi referenciado na tabela cidades, ou seja, ao contrario do que eu queria que o mesmo fizesse.

Se puderem me ajudar

create table estado(
    id_estado integer primary key,
    nome varchar(20)
);
create table cidade(
    id_cidade integer primary key,
    nome varchar(20),
    id_estado integer references estado (id_estado)
);
insert into estado values(1, 'Santa Catarina');
insert into estado values(2, 'Parana');
insert into estado values(3, 'Rio Grande do Sul');

insert into cidade values(1, 'Vitor Meireles', 1);
insert into cidade values(2, 'Curitiba', 2);
insert into cidade values(3, 'Dona Emma');

create trigger verifica_sem_municipio
before insert on cidade
For Each Row
    execute procedure apaga_estado();

create function apaga_estado() returns opaque as '
declare 
    cd_estado integer;
begin
    cd_estado := new.id_estado;
    if not exists(select * from cidade where id_estado = cd_estado)
    then
        delete from estado where id_estado = null;
        raise notice ''Estado % foi apagado'',cd_estado;
    end if;
    return null;
End;
' language 'plpgsql';

Link to comment
Share on other sites

1 answer to this question

Recommended Posts

  • 0

Ola Josieli, eu fiz dessa forma e deu certo, espero que ajude

 

create trigger verifica_sem_municipio
AFTER insert on cidade              -- troquei o before pelo after, porque pra mim fica estranho deletar um registro que ainda não foi inserido.
For Each Row
    execute procedure apaga_estado();
CREATE OR REPLACE FUNCTION public.apaga_estado()
  RETURNS trigger AS
$BODY$
declare
    cd_cidade integer;
    cd_estado integer;
begin
    cd_cidade := new.id_cidade; -- atribui o novo ID da cidade na variável
    cd_estado := new.id_estado; -- mantive o seu código
    
    if not exists(select * from cidade where id_estado = cd_estado)
    then
    delete from public."cidade" where cidade.id_cidade = cd_cidade; -- Fiz isso pra apagar o ultimo
--registro inserido no banco. Esse "public.cidade" que coloquei é pra referenciar a tabela cidade, no --PgAdmin III é necessario fazer isso.
    end if;
    return null;
End;
$BODY$
  LANGUAGE plpgsql
Edited by lucasiigd
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share



  • Forum Statistics

    • Total Topics
      149.6k
    • Total Posts
      646.1k
×
×
  • Create New...