Newsgroup: it.comp.os.linux.development
Titolo: trigger sull'insert

Salve a tutti.
Il mio problema è il seguente :
devo realizzare l'inserimento in una tabella di un db postgreSQL da un
applicativo che non può conoscere la chiave primaria della stessa, per
cui costruisco un trigger che, prima dell'inserimento,m determini il
valore della chiave ed inserisca i valori.
Per fare questo in Oracle userei il seguente codice, data una tabella
Tprova con una primary key chiave ed una sequenza Sprova :
create or replace trigger TRprova before insert on Tprova
for each row
begin
  select Sprova.nextval into :new.chiave from dual;
end;
In postgre conosco la codifica del create trigger ma non so come
realizzare l'inserimento nella tabella nel nuovo record
Esiste il modo?
grazie a tutti,
Matteo

 Matteo
ciao ... spero di aver capito bene ;-))
-- 
#include <stdio.h>
int main(void){char c[]={10,65,110,116,111,110,105,111,32,98,97,114,98,111,110,
101,32,60,104,105,110,100,101,109,105,116,64,116,105,115,99,97,108,105,110,101,
116,46,105,116,62,10,10,0};printf("%s",c);return 0;}

ciao ... spero di aver capito bene ;-))
grazie ancora, se mi sai delucidare su quanto sopra penso di essere a
posto :-) 
Grazie e ciao
Matteo
www.genhome.org

 Grazie e ciao
ciao ... fammi sapere se non ti e' chiaro ancora qualcosa ...


In risposta al mio stesso quesito ho ricevuto una segnalazione su un
tipo di dati che non conscevo e che risolve il problema.
Esiste il tipo serial, del quale riporto la descrizione dall'help di
postgresql :
8.1.4. Serial Types
The data types serial and bigserial are not true types, but merely a
notational convenience for setting up unique identifier columns
(similar to the AUTO_INCREMENT property supported by some other
databases). In the current implementation, specifying 
CREATE TABLE tablename (
     colname SERIAL
 );
is equivalent to specifying: 
CREATE SEQUENCE tablename_colname_seq;
 CREATE TABLE tablename (
     colname integer DEFAULT nextval('tablename_colname_seq') NOT NULL
 );
Thus, we have created an integer column and arranged for its default
values to be assigned from a sequence generator. A NOT NULL constraint
is applied to ensure that a null value cannot be explicitly inserted,
either. In most cases you would also want to attach a UNIQUE or
PRIMARY KEY constraint to prevent duplicate values from being inserted
by accident, but this is not automatic. 
Note: Prior to PostgreSQL 7.3, serial implied UNIQUE. This is no
longer automatic. If you wish a serial column to be in a unique
constraint or a primary key, it must now be specified, same as with
any other data type. 
To insert the next value of the sequence into the serial column,
specify that the serial column should be assigned its default value.
This can be done either by excluding the column from the list of
columns in the INSERT statement, or through the use of the DEFAULT key
word. 
The type names serial and serial4 are equivalent: both create integer
columns. The type names bigserial and serial8 work just the same way,
except that they create a bigint column. bigserial should be used if
you anticipate the use of more than 231 identifiers over the lifetime
of the table. 
The sequence created for a serial column is automatically dropped when
the owning column is dropped, and cannot be dropped otherwise. (This
was not true in PostgreSQL releases before 7.3. Note that this
automatic drop linkage will not occur for a sequence created by
reloading a dump from a pre-7.3 database; the dump file does not
contain the information needed to establish the dependency link.)
Furthermore, this dependency between sequence and column is made only
for the serial column itself; if any other columns reference the
sequence (perhaps by manually calling the nextval function), they will
be broken if the sequence is removed. Using a serial column's sequence
in such a fashion is considered bad form; if you wish to feed several
columns from the same sequence generator, create the sequence as an
independent object. 

 Quindi l'istruzione che suggerisci diventa
domanda:
non ho capito perche' non usi semplicemente un auto increment,
dal codice che hai postato (quello per oracle) non mi sembra che ti 
interessi ritornare il nuovo id al programma che ha effettuato l'insert?
Che c'e' di male nel marcare la colonna id come auto_increment (non mi 
ricordo la terminologia esatta)?
Se, invece, ti serve il valore del l'ultimo id generato, perche; non usi 
una SP?
Se non sabglio le SP dovrebbero essere operazioni atomiche
saluti

 postgresql :
errore mio a non segnalartelo prima ... mi sono impantanato con le trigger e
non ho pensato a come risolvere il problema diversamente ;-)))
e il bello e' che uso anch'io i serial su alcune tabelle ...
sorry about ...
