Inserisci ... Tornando .. Viene vuoto quando prima il trigger annulla la dichiarazione
-
21-12-2019 - |
Domanda
Ho un postgreSQL prima di inserire il trigger su creare che fondamentalmente reindirizza gli inserti in sottocavibili. Una volta che ho inserito il record, voglio interrompere la richiesta in cui evitare i dati duplicati (non inserendo in tabella dei genitori) in modo che sto usando il rimedio null nel trigger. Il problema è che ho bisogno del record da restituire, quindi posso ottenere l'ID. Se restituisco null, ottengo null.
Il problema di cui sopra è discusso al link sotto: Trigger postgresql non restituire nulla
Una delle risposte dice di inserire nella tabella dei genitori (non restituendo NULL ma tornando nuovo) e utilizzare dopo il trigger inserito per eliminarlo dalla tabella dei genitori. Ma sto guardando 1000 scritture al secondo e questo può essere un grave problema sulla performance a causa dei cancellati. C'è qualche altro modo per farlo?
Per essere esatti c'è un modo per restituire l'ID di una riga inserita senza inserire nella tabella dei genitori e cancellarlo in seguito.
Soluzione
Ho scritto La risposta che ti riferisci a . Come ho già accennato laggiù:
.Puoi anche usare un
RULE ... INSTEAD ..
per questo scopo.
RULE
Regole può essere complicato. Preferirei usare i trigger dove possibile. Assicurati di leggere un bit , prima di provare questo:
CREATE OR REPLACE RULE tbl_ins AS
ON INSERT TO tbl
DO INSTEAD
INSERT INTO tbl2 (col1, col2, ...) -- just do mention columns where ...
VALUES (NEW.col1, NEW.col2, ...) -- ... you want to insert column defaults
RETURNING tbl2.*
.
che restituirebbe i valori da tbl2
evitando le righe Phantom. Comunale , per documentazione su CREATE RULE
:
.In regola per
INSERT
,UPDATE
oDELETE
su una vista, è possibile aggiungere aRETURNING
clausola che emette le colonne della vista. Questa clausola sarà utilizzato per calcolare le uscite se la regola viene attivata da unINSERT RETURNING
,UPDATE RETURNING
oDELETE RETURNING
Comando rispettivamente. Quando la regola viene attivata da un comando senzaRETURNING
, la regola La clausolaRETURNING
verrà ignorata. L'attuale implementazione consente Solo le regole diINSTEAD
incondizionate per contenereRETURNING
;
GRAUARD Enfasi Miniera.
Dato che menziona sub-tables
, lo prendo avresti bisogno di condizioni per distribuire gli inserti ...
generacodictagcode / currval()
Se si utilizza con un trigger lastval()
è possibile recuperare facilmente valori appropriati da sequenze con FOR EACH ROW
/ currval()
. La parte difficile è quella di restituire quei valori da una funzione di trigger. Posso solo pensare di scrivere a un tavolo temporaneo. Ha bisogno di un po 'di pensare quando creare e quando cadere quello ...
Avrei probabilmente ripensare l'intero approccio e reindirizza i dati su più istruzioni generatori di generazioneGode alle tabelle di destinazione effettiva ...