1

Temat: Trigger - Utworzenie wielu rekordów z jednego

Cześć wszystkim

Czy da się utworzyć taki trigger który z jednego rekordu przychodzącego utworzy wiele rekordów docelowych ?
Powiedzmy mam tabelę z kolumnami ID(autoincrement),OSOBA,PRODUKT - z formatki idzie insert jednego rekordu z kolumnami OSOBA,PRODUKT np:
'Jan Kowalski','Produkt 1,Produkt 2,Produkt 3'
zamiast tego rekordu chcę do tabeli wstawić 3 rekordy z kolejnymi ID a więc:
1,'Jan Kowalski','Produkt1'
2,'Jan Kowalski','Produkt2'
3,'Jan Kowalski','Produkt3'

Próbowałem z funkcją która zwraca (setof record) ale funkcja triggera nie może zwracać nic innego niż trigger
Próbowałem też wewnątrz funkcji triggera robić insert ale to z kolei wywołuje kolejne triggery więc się robi zagnieżdząona pętla.

z góry dzięki za pomoc

2

Odp: Trigger - Utworzenie wielu rekordów z jednego

A może nie trzeba triggera
Zerknij na ten insert

insert into tabela (osoba,produkt) select osoba,unnest(produkt) as produkt from (select 'Jan Kowalski' as osoba,string_to_array('Produkt 1,Produkt 2,Produkt 3',',') as produkt) dane

3

Odp: Trigger - Utworzenie wielu rekordów z jednego

Michał dzięki wielkie za odpowiedź.

Niestety nie mam możliwości odpalenia tego zapytania. Chodzi o to, że na formatce używamy gotowego rozwiązania(edytor tabel) , który robi po prostu operacje na tabeli(insert, update, delete). Jedyne miejsce w którym mogę przechwycić dane z tego edytora(bez jego przerabiania) i coś z nimi porobić jest trigger.

4

Odp: Trigger - Utworzenie wielu rekordów z jednego

to jest zwykły insert, który dodaje twoje dane w formacie jaki przesłałeś do tabeli. Tyle tylko, że od razu rozdziela string na poszczególne produkty. Trigger może sporo powiększyć czasy insertów, ale OK twój wybór

Połącz się z bazą PGAdminem i zobacz jak to działa (wykonaj sam select za insertem)

Proponuję - przemyśl sprawę
Jeśli już masz to robić to wykorzystać polecenie CREATE RULE z opcją wykonywania operacji zamiast INSERTA wysłanego przez użytkownika  (będzie szybciej)

Jeśli chcesz triggera to podeślij strukturę tabeli i przykładowy insert jaki wychodzi z aplikacji, która jest klientem bazy danych

Ostatnio edytowany przez c_michal (2016-08-12 14:12:28)

5

Odp: Trigger - Utworzenie wielu rekordów z jednego

Rozumiem ,że jest to zwykły insert, sprawdziłem jak działa ale chodzi tylko o to, że tak jak napisałem wcześniej korzystamy z gotowego komponentu do edycji tabeli przez www(javascript + JAVA). Nie mam możliwości podmienić lub wymusić inserta który generuje ten komponent. Jedyne miejsce gdzie mogę przechwycić dane z tego komponentu to jest baza. Dlatego pomysł z triggerem.

6

Odp: Trigger - Utworzenie wielu rekordów z jednego

A możesz zmusić klienta www by inserty wykonywał na widok a update na tabelę?

Jeśli tak to zobacz jak to działa w PGAdminie

create table tabela (id serial primary key,osoba varchar(100),produkt varchar(1000));
create view v_tabela as select * from tabela;
CREATE OR REPLACE RULE "_INSERT" AS
   ON INSERT TO v_tabela
   DO INSTEAD
insert into tabela (osoba,produkt) select osoba,unnest(produkt) as produkt from (select new.osoba as osoba,string_to_array(new.produkt,',') as produkt) dane;

insert into v_tabela (osoba,produkt) values ('Jan Kowalski','Produkt 1,Produkt 2,Produkt 3');

select * from tabela;

Ostatnio edytowany przez c_michal (2016-08-12 14:34:44)