Ir para conteúdo
Fórum Script Brasil
  • 0

Triggers


Josieli

Pergunta

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 para o comentário
Compartilhar em outros sites

1 resposta a esta questão

Posts Recomendados

  • 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
Editado por lucasiigd
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...