<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
	<channel>
		<title><![CDATA[Forum PostgreSQL - Problem z wyzwalaczem]]></title>
		<link>https://forum.postgresql.org.pl/viewtopic.php?id=1848</link>
		<description><![CDATA[Najświeższe odpowiedzi w Problem z wyzwalaczem.]]></description>
		<lastBuildDate>Mon, 03 Jun 2013 20:06:13 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Odp: Problem z wyzwalaczem]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=4566#p4566</link>
			<description><![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 ;)]]></description>
			<author><![CDATA[dummy@example.com (Natka16k)]]></author>
			<pubDate>Mon, 03 Jun 2013 20:06:13 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=4566#p4566</guid>
		</item>
		<item>
			<title><![CDATA[Odp: Problem z wyzwalaczem]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=4565#p4565</link>
			<description><![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);]]></description>
			<author><![CDATA[dummy@example.com (c_michal)]]></author>
			<pubDate>Mon, 03 Jun 2013 12:23:11 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=4565#p4565</guid>
		</item>
		<item>
			<title><![CDATA[Odp: Problem z wyzwalaczem]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=4562#p4562</link>
			<description><![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]]]></description>
			<author><![CDATA[dummy@example.com (depesz)]]></author>
			<pubDate>Sun, 02 Jun 2013 11:00:44 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=4562#p4562</guid>
		</item>
		<item>
			<title><![CDATA[Problem z wyzwalaczem]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=4561#p4561</link>
			<description><![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 ;)]]></description>
			<author><![CDATA[dummy@example.com (Natka16k)]]></author>
			<pubDate>Sat, 01 Jun 2013 18:39:31 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=4561#p4561</guid>
		</item>
	</channel>
</rss>
