[pgSQL] PGAdmin 4 INSERT doet niets

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Dorgaldir
  • Registratie: September 2009
  • Laatst online: 10-04 22:52

Dorgaldir

Creature of the web

Topicstarter
Ik heb een tabel:

SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
CREATE TABLE commence.adminvalue
(
    cmc_thid uuid NOT NULL,
    name text COLLATE pg_catalog."default",
    valuenumeric numeric DEFAULT 0,
    valuetext text COLLATE pg_catalog."default",
    CONSTRAINT adminvalue_pkey PRIMARY KEY (cmc_thid)
)
WITH (
    OIDS = FALSE
)
TABLESPACE pg_default;

ALTER TABLE commence.adminvalue
    OWNER to "A";

CREATE TRIGGER adminvalue_queuetrigger
    AFTER INSERT OR DELETE OR UPDATE 
    ON commence.adminvalue
    FOR EACH ROW
    EXECUTE PROCEDURE webviewsync.webview_queue_func();

CREATE TRIGGER adminvalue_recycomsync
    AFTER INSERT OR DELETE OR UPDATE 
    ON commence.adminvalue
    FOR EACH ROW
    EXECUTE PROCEDURE recycom_sync.add_queue();


CREATE TRIGGER check_key
    BEFORE INSERT
    ON commence.adminvalue
    FOR EACH ROW
    EXECUTE PROCEDURE recycom_sync.check_key();


Op die tabel wil ik via PGAdmin een INSERT doen, dus ik ga via het generate script voor een INSERT een maak een INSERT query

SQL:
1
2
3
INSERT INTO commence.adminvalue(
    cmc_thid, name, valuenumeric, valuetext)
    VALUES (null, 'TEST01', 5, 'Een waarde; nog een waarde');


(Ja de cmc_thid mag niet null zijn, maar de check_key trigger vangt dit op en vult die in indien die leeg is)

Maar bij het uitvoeren van die query gebeurd er niets. Ik krijg dit resultaat:

code:
1
2
3
INSERT 0 0

Query returned successfully in 157 msec.


en vind dit in de logs:

code:
1
2
3
2018-01-17 14:37:46 CET [5012]: [9-1] user=A,db=recycom_commence,app=pgAdmin 4 - CONN:6994,client=99.99.9.99 LOG:  statement: INSERT INTO commence.adminvalue(
        cmc_thid, name, valuenumeric, valuetext)
        VALUES (null, 'TEST01', 5, 'Een waarde; nog een waarde');


maar meer niet, dus ik snap niet goed wat er mis gaat, waarom hij die INSERT niet gewoon wil doen...

Just me


Acties:
  • 0 Henk 'm!

  • Kalentum
  • Registratie: Juni 2004
  • Laatst online: 20:42
Je insert een null value in een column die NOT NULL is. Zoals je al zegt. Wat als je die column weglaat uit je INSERT?

[ Voor 37% gewijzigd door Kalentum op 17-01-2018 20:22 ]


Acties:
  • 0 Henk 'm!

  • Damic
  • Registratie: September 2003
  • Laatst online: 20:52

Damic

Tijd voor Jasmijn thee

Die kolom weg laten, zou de truc moeten zijn.

Al wat ik aanraak werk niet meer zoals het hoort. Damic houd niet van zijn verjaardag


Acties:
  • 0 Henk 'm!

  • gekkie
  • Registratie: April 2000
  • Laatst online: 18:52
En wat is de code van "recycom_sync.check_key()" ?
(die ontbreekt in de code waarin je inzicht geeft)

Maar had dan sowieso een error verwacht ipv een succesfull query en insert 0 0.
Of je vangt wellicht die error af in je trigger of iets dergelijks ?

Acties:
  • 0 Henk 'm!

  • MSteverink
  • Registratie: Juni 2004
  • Laatst online: 24-09 15:32
Je geeft een NULL-waarde op voor een kolom die niet NULL mag zijn. Weliswaar stel je dat
Ja de cmc_thid mag niet null zijn, maar de check_key trigger vangt dit op en vult die in indien die leeg is
, maar die trigger wordt uitgevoerd NA de insert. En de insert wordt niet uitgevoerd, omdat, jawel, de waarde niet NULL mag zijn.

Gelukkig kent PostGres ook een TRIGGER BEFORE INSERT.

Acties:
  • 0 Henk 'm!

  • Dorgaldir
  • Registratie: September 2009
  • Laatst online: 10-04 22:52

Dorgaldir

Creature of the web

Topicstarter
als ik cmc_thid niet meegeef werkt het ook niet, dat had ik al getest.

de code van check_key:
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
BEGIN
    -- sanity check, are we an AFTER trigger?
    IF TG_WHEN <> 'BEFORE' THEN
        RAISE EXCEPTION 'recycom_sync.check_key() may only run as an BEFORE trigger';
    End IF;
    
    IF NEW.cmc_thid IS NULL THEN 
        NEW.cmc_thid = webviewsync.gen_random_uuid();
    End IF;
    
RETURN NULL;
END;


en MSteverink, het is toch een BEFORE trigger, dus die zou moeten uitgevoerd worden voor de INSERT, en tot hiertoe werkte deze methode wel.

Just me


Acties:
  • 0 Henk 'm!

  • MSteverink
  • Registratie: Juni 2004
  • Laatst online: 24-09 15:32
[b]Dorgaldir schreef op donderdag 18 januari 2018 @ 09:07
en MSteverink, het is toch een BEFORE trigger, dus die zou moeten uitgevoerd worden voor de INSERT, en tot hiertoe werkte deze methode wel.
Oei. Daar had ik heel slecht gelezen.

Acties:
  • 0 Henk 'm!

  • Kalentum
  • Registratie: Juni 2004
  • Laatst online: 20:42
code:
1
2
3
4
5
6
7
8
9
10
11
CREATE TABLE commence.adminvalue
(
    cmc_thid uuid NOT NULL DEFAULT ,
    name text COLLATE pg_catalog."default",
    valuenumeric numeric DEFAULT 0,
    valuetext text COLLATE pg_catalog."default",
    CONSTRAINT adminvalue_pkey PRIMARY KEY (cmc_thid)
)
WITH (
    OIDS = FALSE
)


Wat als je webviewsync.gen_random_uuid() als default value voor je primary key set? Dan kun je die trigger weggooien.

Acties:
  • +1 Henk 'm!

  • gekkie
  • Registratie: April 2000
  • Laatst online: 18:52
Dorgaldir schreef op donderdag 18 januari 2018 @ 09:07:
als ik cmc_thid niet meegeef werkt het ook niet, dat had ik al getest.

de code van check_key:
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
BEGIN
    -- sanity check, are we an AFTER trigger?
    IF TG_WHEN <> 'BEFORE' THEN
        RAISE EXCEPTION 'recycom_sync.check_key() may only run as an BEFORE trigger';
    End IF;
    
    IF NEW.cmc_thid IS NULL THEN 
        NEW.cmc_thid = webviewsync.gen_random_uuid();
    End IF;
    
RETURN NULL;
END;


en MSteverink, het is toch een BEFORE trigger, dus die zou moeten uitgevoerd worden voor de INSERT, en tot hiertoe werkte deze methode wel.
Vanuit: https://www.postgresql.or...c/trigger-definition.html
(vervelend te lezen stukje van de docs moet ik zeggen)
Trigger functions invoked by per-statement triggers should always return NULL. Trigger functions invoked by per-row triggers can return a table row (a value of type HeapTuple) to the calling executor, if they choose. A row-level trigger fired before an operation has the following choices:

It can return NULL to skip the operation for the current row. This instructs the executor to not perform the row-level operation that invoked the trigger (the insertion, modification, or deletion of a particular table row).

For row-level INSERT and UPDATE triggers only, the returned row becomes the row that will be inserted or will replace the row being updated. This allows the trigger function to modify the row being inserted or updated.

A row-level BEFORE trigger that does not intend to cause either of these behaviors must be careful to return as its result the same row that was passed in (that is, the NEW row for INSERT and UPDATE triggers, the OLD row for DELETE triggers).
Kortom zou het kunnen dat je NEW moet returnen ipv NULL ?

Acties:
  • 0 Henk 'm!

  • Dorgaldir
  • Registratie: September 2009
  • Laatst online: 10-04 22:52

Dorgaldir

Creature of the web

Topicstarter
rutgerw schreef op donderdag 18 januari 2018 @ 16:13:
code:
1
2
3
4
5
6
7
8
9
10
11
CREATE TABLE commence.adminvalue
(
    cmc_thid uuid NOT NULL DEFAULT ,
    name text COLLATE pg_catalog."default",
    valuenumeric numeric DEFAULT 0,
    valuetext text COLLATE pg_catalog."default",
    CONSTRAINT adminvalue_pkey PRIMARY KEY (cmc_thid)
)
WITH (
    OIDS = FALSE
)


Wat als je webviewsync.gen_random_uuid() als default value voor je primary key set? Dan kun je die trigger weggooien.
Omdat die soms niet automatisch ingegeven moet worden, en het lukt met het pakket dat ik gebruik niet om een andere waarde mee te geven indien er een default waarde is ingegeven...
gekkie schreef op donderdag 18 januari 2018 @ 17:20:
[...]

Kortom zou het kunnen dat je NEW moet returnen ipv NULL ?
Jawel, dat lijkt het te doen!

Just me


Acties:
  • 0 Henk 'm!

  • gekkie
  • Registratie: April 2000
  • Laatst online: 18:52
Dorgaldir schreef op vrijdag 19 januari 2018 @ 03:01:
[...]
Jawel, dat lijkt het te doen!
Mooi, devil is in the details soms :)
Omdat die soms niet automatisch ingegeven moet worden, en het lukt met het pakket dat ik gebruik niet om een andere waarde mee te geven indien er een default waarde is ingegeven...
Hmm dat is wel heel apart, de oplossing van een default waarde is namelijk wel waar voor het bedoeld is en daarmee mooier. Lijkt me toch vreemd dat een client danwel iets wat daar gebruik van maakt daar moeite mee zou hebben. Zolang het gewoon een waarde voor die kolom specificeert zou je die horen te krijgen en anders wat de default definieert.
Pagina: 1