Обсуждение: After insert trigger not work
Hello!
I use postgre-9.3.5 on windows7 x64.
Trigger should update data in table:
CREATE TABLE trassa.ram_free_stat
(
id serial NOT NULL,
device integer NOT NULL,
min_value integer NOT NULL,
avg_value integer NOT NULL DEFAULT 0,
max_value integer NOT NULL,
last_update timestamp without time zone NOT NULL DEFAULT now(),
CONSTRAINT ram_free_stat_pk PRIMARY KEY (id),
CONSTRAINT ram_free_stat_device_fk FOREIGN KEY (device)
REFERENCES trassa.devices (id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT ram_free_stat_max_fk FOREIGN KEY (max_value)
REFERENCES trassa.ram (id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT ram_free_stat_min_fk FOREIGN KEY (min_value)
REFERENCES trassa.ram (id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
)
My trigger:
CREATE OR REPLACE FUNCTION trassa.update_ram_free_stat()
RETURNS trigger AS
$BODY$
DECLARE
device_id INTEGER DEFAULT 0;
min_id INTEGER DEFAULT 0;
avg_val INTEGER DEFAULT 0;
max_id INTEGER DEFAULT 0;
BEGIN
SELECT id INTO device_id FROM trassa.ram_free_stat
WHERE device = NEW.device;
SELECT free_ram, id INTO min_id FROM trassa.ram
WHERE device = NEW.device
ORDER BY free_ram LIMIT 1;
SELECT free_ram, id INTO max_id FROM trassa.ram
WHERE device = NEW.device
ORDER BY free_ram DESC LIMIT 1;
SELECT CEIL(AVG(free_ram)) INTO avg_val
FROM trassa.ram WHERE device = NEW.device;
IF device_id > 0 THEN
UPDATE trassa.ram_free_stat
SET min_value = min_id,
avg_value = avg_val,
max_value = max_id
WHERE id = device_id;
ELSE
INSERT INTO trassa.ram_free_stat
(device, min_value,
avg_value, max_value)
VALUES(NEW.device, min_id,
avg_val, max_id);
END IF;
RETURN NULL;
END;
$BODY$
LANGUAGE plpgsql VOLATILE SECURITY DEFINER
COST 100;
I add this trigger on another table:
CREATE TRIGGER update_ram_free_stat_trigger
AFTER INSERT
ON trassa.ram
FOR EACH ROW
EXECUTE PROCEDURE trassa.update_ram_free_stat();
All executed without any error, but data in trassa.ram_free_stat not
updated.
Can you help me solve this problem?
Thank you and excuse me for my bad english.
--
Best regards,
Brilliantov Kirill Vladimirovich
Melvin Davidson wrote on 11/13/2014 05:29 PM: > s for > I suspect your problem is because you have 6 columns that are NOT NULL, but > on INSERT you are only supplying values for 4 columns plus the id(serial). > Therefore, the INSERT will fail. Perhaps if you supplied a value for > last_update you it will work a lot better. Hello, Melvin! Why this is a problem is last_update column created with default value? >> Trigger should update data in table: >> CREATE TABLE trassa.ram_free_stat >> ( >> id serial NOT NULL, >> device integer NOT NULL, >> min_value integer NOT NULL, >> avg_value integer NOT NULL DEFAULT 0, >> max_value integer NOT NULL, >> last_update timestamp without time zone NOT NULL DEFAULT now(), >> CONSTRAINT ram_free_stat_pk PRIMARY KEY (id), >> CONSTRAINT ram_free_stat_device_fk FOREIGN KEY (device) >> REFERENCES trassa.devices (id) MATCH SIMPLE >> ON UPDATE NO ACTION ON DELETE NO ACTION, >> CONSTRAINT ram_free_stat_max_fk FOREIGN KEY (max_value) >> REFERENCES trassa.ram (id) MATCH SIMPLE >> ON UPDATE NO ACTION ON DELETE NO ACTION, >> CONSTRAINT ram_free_stat_min_fk FOREIGN KEY (min_value) >> REFERENCES trassa.ram (id) MATCH SIMPLE >> ON UPDATE NO ACTION ON DELETE NO ACTION >> ) >> -- Best regards, Brilliantov Kirill Vladimirovich
On 11/13/2014 04:27 AM, Brilliantov Kirill Vladimirovich wrote:
> Hello!
> I use postgre-9.3.5 on windows7 x64.
> Trigger should update data in table:
> CREATE TABLE trassa.ram_free_stat
> (
> id serial NOT NULL,
> device integer NOT NULL,
> min_value integer NOT NULL,
> avg_value integer NOT NULL DEFAULT 0,
> max_value integer NOT NULL,
> last_update timestamp without time zone NOT NULL DEFAULT now(),
> CONSTRAINT ram_free_stat_pk PRIMARY KEY (id),
> CONSTRAINT ram_free_stat_device_fk FOREIGN KEY (device)
> REFERENCES trassa.devices (id) MATCH SIMPLE
> ON UPDATE NO ACTION ON DELETE NO ACTION,
> CONSTRAINT ram_free_stat_max_fk FOREIGN KEY (max_value)
> REFERENCES trassa.ram (id) MATCH SIMPLE
> ON UPDATE NO ACTION ON DELETE NO ACTION,
> CONSTRAINT ram_free_stat_min_fk FOREIGN KEY (min_value)
> REFERENCES trassa.ram (id) MATCH SIMPLE
> ON UPDATE NO ACTION ON DELETE NO ACTION
> )
>
> My trigger:
> CREATE OR REPLACE FUNCTION trassa.update_ram_free_stat()
> RETURNS trigger AS
> $BODY$
> DECLARE
> device_id INTEGER DEFAULT 0;
> min_id INTEGER DEFAULT 0;
> avg_val INTEGER DEFAULT 0;
> max_id INTEGER DEFAULT 0;
> BEGIN
> SELECT id INTO device_id FROM trassa.ram_free_stat
> WHERE device = NEW.device;
> SELECT free_ram, id INTO min_id FROM trassa.ram
> WHERE device = NEW.device
> ORDER BY free_ram LIMIT 1;
In above and below you are selecting two column values into one integer
variable, you may not be getting what you think you are:
test=> DO $$
DECLARE
var_1 integer DEFAULT 0;
BEGIN
SELECT 10, 1 INTO var_1;
RAISE NOTICE '%', var_1;
END;
$$ LANGUAGE plpgsql
;
NOTICE: 10
DO
Or maybe you are, it is not clear what the variables are supposed to
hold. From the name I would say the device id, from how they are used
below I would say the free ram values.
> SELECT free_ram, id INTO max_id FROM trassa.ram
> WHERE device = NEW.device
> ORDER BY free_ram DESC LIMIT 1;
> SELECT CEIL(AVG(free_ram)) INTO avg_val
> FROM trassa.ram WHERE device = NEW.device;
> IF device_id > 0 THEN
> UPDATE trassa.ram_free_stat
> SET min_value = min_id,
> avg_value = avg_val,
> max_value = max_id
> WHERE id = device_id;
> ELSE
> INSERT INTO trassa.ram_free_stat
> (device, min_value,
> avg_value, max_value)
> VALUES(NEW.device, min_id,
> avg_val, max_id);
> END IF;
> RETURN NULL;
> END;
> $BODY$
> LANGUAGE plpgsql VOLATILE SECURITY DEFINER
> COST 100;
>
> I add this trigger on another table:
> CREATE TRIGGER update_ram_free_stat_trigger
> AFTER INSERT
> ON trassa.ram
> FOR EACH ROW
> EXECUTE PROCEDURE trassa.update_ram_free_stat();
>
> All executed without any error, but data in trassa.ram_free_stat not
> updated.
> Can you help me solve this problem?
You might to put some RAISE NOTICEs in your function to track what is
going on:
http://www.postgresql.org/docs/9.3/interactive/plpgsql-errors-and-messages.html
> Thank you and excuse me for my bad english.
>
--
Adrian Klaver
adrian.klaver@aklaver.com