> Galera, estamos quase la....
>
> ERROR: record "new" has no field "jogador1"
> CONTEXT: PL/pgSQL function "verifica_6_partidas" line 4 at SQL statement
> SQL function "sp_ins_partida" statement 1
>
> CREATE FUNCTION verifica_6_partidas() RETURNS trigger AS $$
> DECLARE
> TOTAL_JOGOS_ANDAMENTO int;
> BEGIN
> SELECT COUNT(*) INTO TOTAL_JOGOS_ANDAMENTO FROM "Partida" WHERE "Fim" IS
> NULL AND ("Jogador1" = NEW.Jogador1 OR "Jogador2" = NEW.Jogador2);
> IF ("TOTAL_JOGOS_ANDAMENTO" = 6) THEN
> RAISE EXCEPTION 'O jogador possui 6 partidas em andamento. Não foi
> possível prosseguir esta operação!';
> END IF;
> RETURN "TOTAL_JOGOS_ANDAMENTO";
> END;
> $$ LANGUAGE plpgsql;
>
> É correto chamar o NEW.Jogador1 e NEW.Jogador2 ??
>
>
> 2009/7/3 Osvaldo Kussama <
osvaldo.kussama@...>
>>
>> 2009/7/3 Leonardo Barbosa <
leogbt@...>:
>> > Osvaldo, foi retornado um erro informando que a linguagem plpgsql não
>> > existe! O que faço?
>> >
>> > 2009/7/3 Osvaldo Kussama <
osvaldo.kussama@...>
>> >>
>> >> 2009/7/3 Leonardo Barbosa <
leogbt@...>:
>> >> > Salve galera!
>> >> >
>> >> > Tou com a necessidade de criar uma trigger para verificar de a
>> >> > quantidade de
>> >> > jogos numa tabela é menor ou igual a 6. Se for maior que 6, o insert
>> >> > não
>> >> > deve ser efetuado.
>> >> >
>> >> > Estou tentando criar a seguinte trigger para realizar essa tarefa:
>> >> >
>> >> > CREATE FUNCTION verifica_6_partidas() RETURNS trigger AS $$
>> >> > BEGIN
>> >> > SELECT COUNT(*) AS TOTAL_JOGOS_ANDAMENTO FROM "Partida" WHERE "Fim"
>> >> > IS
>> >> > NULL AND ("Jogador1" = NEW.Jogador1 OR "Jogador2" = NEW.Jogador2)
>> >> > IF ("TOTAL_JOGOS_ANDAMENTO" = 6) THEN
>> >> > RAISE EXCEPTION 'O jogador possui 6 partidas em andamento. Não
>> >> > foi
>> >> > possível prosseguir esta operação!';
>> >> > END IF;
>> >> > END;
>> >> > $$ LANGUAGE internal
>> >> >
>> >> > CREATE TRIGGER "trigger_verifica_6_partidas" BEFORE INSERT
>> >> > ON "public"."Partida" FOR EACH STATEMENT
>> >> > EXECUTE PROCEDURE "verifica_6_partidas"();
>> >> >
>> >> > A mensagem de erro que é retornada é a seguinte:
>> >> > ERROR: there is no built-in function named "
>> >> > SELECT COUNT(*) AS TOTAL_JOGOS_ANDAMENTO FROM "Partida" WHERE "Fim"
>> >> > IS
>> >> > NULL AND ("Jogador1" = NEW.Jogador1 OR "Jogador2" = NEW.Jogador2)
>> >> > IF ("TOTAL_JOGOS_ANDAMENTO" = 6) THEN
>> >> > RAISE EXCEPTION 'O jogador possui 6 partidas em andamento. Não
>> >> > foi
>> >> > possível prosseguir esta operação!';
>> >> >
>> >> > Alguem ai sabe o que pode estar acontecendo? Onde estou errando ?
>> >> >
>> >>
>> >>
>> >> Tente:
>> >>
>> >> CREATE FUNCTION verifica_6_partidas() RETURNS trigger AS $$
>> >> DECLARE
>> >> TOTAL_JOGOS_ANDAMENTO int;
>> >> BEGIN
>> >> SELECT COUNT(*) INTO TOTAL_JOGOS_ANDAMENTO FROM "Partida" WHERE
>> >> "Fim" IS NULL AND ("Jogador1" = NEW.Jogador1 OR "Jogador2" =
>> >> NEW.Jogador2);
>> >> IF ("TOTAL_JOGOS_ANDAMENTO" = 6) THEN
>> >> RAISE EXCEPTION 'O jogador possui 6 partidas em andamento. Não
>> >> foi possível prosseguir esta operação!';
>> >> END IF;
>> >> END;
>> >> $$ LANGUAGE plpgsql;
>> >>
>> >> Repare no SELECT...INTO...
>> >>
>> >>
>> >>
http://www.postgresql.org/docs/current/interactive/plpgsql-statements.html#PLPGSQL-STATEMENTS-SQL-ONEROW>> >> e no ; ao final.
>> >> A variável TOTAL_JOGOS_ANDAMENTO precisa ser declarada, ela tem que
>> >> ser uma variável e não é um alias.
>> >>
>>
>>
>> Veja CREATE LANGUAGE:
>>
http://www.postgresql.org/docs/8.3/interactive/sql-createlanguage.html>>
>> Para que ela passe a existir nos novos banco de dados crie também no
>> template.
>>
>> Osvaldo
>>
>> PS. E não deixe de ver a observação do Euler
>>
Isso que dá ficar utilizando nomes de campos com aspas. Agora tem que