<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Forum PostgreSQL - Problem z wyzwalaczem]]></title>
	<link rel="self" href="http://forum.postgresql.org.pl/extern.php?action=feed&amp;tid=1848&amp;type=atom"/>
	<updated>2013-06-03T20:06:13Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.postgresql.org.pl/viewtopic.php?id=1848</id>
		<entry>
			<title type="html"><![CDATA[Odp: Problem z wyzwalaczem]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=4566#p4566"/>
			<content type="html"><![CDATA[Wielkie dzięki za pomoc. Wasze sugestie bardzo mi pomogły i wreszcie udało mi się dokończyć projekt, więc jeszcze raz wielkie dzięki ;)]]></content>
			<author>
				<name><![CDATA[Natka16k]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=1588</uri>
			</author>
			<updated>2013-06-03T20:06:13Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=4566#p4566</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: Problem z wyzwalaczem]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=4565#p4565"/>
			<content type="html"><![CDATA[Proponuje twój problem rozwiązać już na etapie dodawania rekordów, zamiast wykonywać insert wywołuj funkcję, która sprawdzi  co trzeba i doda lub nie rekordy - poniżej przykład takiej funkcji działającej na przykładowej tabeli

CREATE TABLE public.test_t
(
id serial primary key,
name varchar(100) not null
) 
WITH (OIDS = FALSE);
truncate public.test_t;

CREATE OR REPLACE FUNCTION Test_count(id INT) RETURNS text AS $BODY$
DECLARE
  rowcount INT;
BEGIN
  BEGIN  
  with dane (name,fkey_id) as (values ('a',1),('b',1),('c',1),('d',1),('f',1),('g',1),('h',1),('i',2),('j',2),('k',2)) 
  insert into test_t (name) select name FROM dane where fkey_id=$1;
  GET DIAGNOSTICS rowcount = ROW_COUNT;
  if rowcount >6 then 
     raise exception '>6';
  end if;
  return 'OK dodałeś '||coalesce(rowcount)||' wierszy';
  exception when raise_exception THEN 
     return 'Błąd: dodajesz '||coalesce(rowcount)||' wierszy, limit to 6';
  end;
END;
$BODY$ LANGUAGE plpgsql;

[b]Sposób użycia:[/b]
select Test_count(1);
select Test_count(2);
select Test_count(0);
select Test_count(null);]]></content>
			<author>
				<name><![CDATA[c_michal]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=627</uri>
			</author>
			<updated>2013-06-03T12:23:11Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=4565#p4565</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: Problem z wyzwalaczem]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=4562#p4562"/>
			<content type="html"><![CDATA[1. get diagnostics działa *po* komendzie wstawiającej. Ale nie na zasadzie "after trigger" tylko jak w kodzie funkcji masz insert/update/delete to możesz sensownie skorzystać z get diagnostics.
2. w twoim przypadku get diagnostics zwraca 0 bo przed nim nie ma żadnego inserta/updatea/delete.
3. w obrebie funkcji nie ma transakcji - wiec zaden "rollback" nie zadziala.
4. case when 1,2,3,4,5,6 ? serio? Nie lepiej/czytelniej użyć ifa?
5. do limitiowania liczby rekordów które modyfikuje pojedyncze zapytanie musisz użyć zasadniczo kombinacji triggerów (da się jednym ale odradzam). zobacz [url]http://www.depesz.com/2007/07/27/update-account-set-password-new_password-oops/[/url]]]></content>
			<author>
				<name><![CDATA[depesz]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=1564</uri>
			</author>
			<updated>2013-06-02T11:00:44Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=4562#p4562</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Problem z wyzwalaczem]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=4561#p4561"/>
			<content type="html"><![CDATA[Mam taki oto kod:

CREATE FUNCTION f_ile_dodano()
RETURNS TRIGGER 
AS $$
	DECLARE 
		ile integer;

	BEGIN
		
		GET DIAGNOSTICS ile:=ROW_COUNT;
		RAISE NOTICE '%',ile;

		CASE ile
			WHEN 0 THEN RAISE NOTICE 'Nie dodano zadnego rekordu';
			WHEN 1,2,3,4,5,6 THEN RAISE NOTICE 'Dodano % rekordow',ile;
			ELSE 
				BEGIN
				RAISE NOTICE 'Dodano za wiele rekordow jednoczesnie. Maksymalna ilosc to 6 nowych rekordow';
				ROLLBACK;
				END;
		END CASE;

	RETURN NULL;
	END;
$$ LANGUAGE 'PLPGSQL';

CREATE TRIGGER ile_dodano
AFTER INSERT ON motorniczy
FOR EACH STATEMENT EXECUTE PROCEDURE f_ile_dodano();

Nie widać w nim żadnych błędów, wszystko tworzy się bez problemu, a podczas wywołania nie wyskakują żadne błędy, ale efekt nie jest taki jakiego się spodziewam - wygląda na to, że wyzwalacz mimo wszystko wykonuje się przed insertem bo wydruki funkcji komunikują, że nie zostaje dodany żaden rekord, a tymczasem wszystkie 7 rekordów (które dla próby dodaję) dodaje się bez żadnego problemu. Czy ktoś widzi gdzie robię błąd?

Z góry dzięki za poświęcenie czasu ;)]]></content>
			<author>
				<name><![CDATA[Natka16k]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=1588</uri>
			</author>
			<updated>2013-06-01T18:39:31Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=4561#p4561</id>
		</entry>
</feed>
