Обсуждение: Simple plpgsql question
Hi,
I have, what I hope to be, a simple question about plpgsql.
I have a trigger on a table right now that updates a count everytime
that a new record is entered into a database (or removed).
What I'd also like to do is have it create a new row in a different
table using the automatically assigned id as a reference, but I'm
unsure of how to obtain the id of the newly created row in the first
table.
Example:
CREATE TABLE system_info (
id serial PRIMARY KEY,
name varchar(255),
value varchar(255)
);
INSERT INTO system_info (name,value) VALUES ('total_users','0');
CREATE TABLE master (
id serial PRIMARY KEY,
name varchar(32) NOT NULL CHECK ( name <> ''),
UNIQUE(name)
);
CREATE TABLE slave (
id serial PRIMARY KEY,
master_id integer REFERENCES master (id),
additional_info text
);
CREATE OR REPLACE FUNCTION update_users() RETURNS trigger AS $$
BEGIN IF TG_OP = 'DELETE' THEN UPDATE system_info SET value=(value::integer)-1 WHERE name =
'total_users' RETURN OLD; ELSEIF TG_OP = 'INSERT' THEN UPDATE system_info SET value=(value::integer)+1
WHEREname =
'total_users';INSERT INTO slave (master_id) VALUES (THIS IS WHAT I NEED TO KNOW); RETURN NEW; END IF; RETURN
NULL;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER update_users AFTER INSERT OR DELETE ON master FOR EACH ROW EXECUTE PROCEDURE update_users();
The part I need to know is the INSERT INTO statement in the procedure.
Any help would be great.
Thanks!
On Thursday 13 April 2006 11:38 pm, "Todd Kennedy" <todd.kennedy@gmail.com>
thus communicated:
--> Hi,
-->
--> I have, what I hope to be, a simple question about plpgsql.
-->
--> I have a trigger on a table right now that updates a count everytime
--> that a new record is entered into a database (or removed).
-->
--> What I'd also like to do is have it create a new row in a different
--> table using the automatically assigned id as a reference, but I'm
--> unsure of how to obtain the id of the newly created row in the first
--> table.
-->
--> Example:
--> CREATE TABLE system_info (
--> id serial PRIMARY KEY,
--> name varchar(255),
--> value varchar(255)
--> );
--> INSERT INTO system_info (name,value) VALUES ('total_users','0');
-->
--> CREATE TABLE master (
--> id serial PRIMARY KEY,
--> name varchar(32) NOT NULL CHECK ( name <> ''),
--> UNIQUE(name)
--> );
-->
--> CREATE TABLE slave (
--> id serial PRIMARY KEY,
--> master_id integer REFERENCES master (id),
--> additional_info text
--> );
-->
--> CREATE OR REPLACE FUNCTION update_users() RETURNS trigger AS $$
--> BEGIN
--> IF TG_OP = 'DELETE' THEN
--> UPDATE system_info SET value=(value::integer)-1 WHERE name =
--> 'total_users'
--> RETURN OLD;
--> ELSEIF TG_OP = 'INSERT' THEN
--> UPDATE system_info SET value=(value::integer)+1 WHERE name =
--> 'total_users';
--> INSERT INTO slave (master_id) VALUES (THIS IS WHAT I NEED TO KNOW);
--> RETURN NEW;
--> END IF;
--> RETURN NULL;
--> END;
--> $$ LANGUAGE plpgsql;
-->
--> CREATE TRIGGER update_users AFTER INSERT OR DELETE ON master
--> FOR EACH ROW EXECUTE PROCEDURE update_users();
-->
-->
--> The part I need to know is the INSERT INTO statement in the procedure.
-->
--> Any help would be great.
-->
--> Thanks!
-->
--> ---------------------------(end of broadcast)---------------------------
--> TIP 4: Have you searched our list archives?
-->
--> http://archives.postgresql.org
-->
INSERT INTO slave (master_id) VALUES (new.id);
The buffer NEW contains all the "new" data.
On Apr 13 11:38, Todd Kennedy wrote:
> What I'd also like to do is have it create a new row in a different
> table using the automatically assigned id as a reference, but I'm
> unsure of how to obtain the id of the newly created row in the first
> table.
If I understand you right, you're refering to a SERIAL column with id.
If so, you can use currval() function over related SEQUENCE. Because of
INSERT/DELETE and trigger will be executed in the same session, they'll
be able to see current value of related sequence. Below is an example
about this:
BEGIN;
CREATE SEQUENCE trig_t_seq START 1;
CREATE TABLE trig_t ( id bigint NOT NULL DEFAULT nextval('trig_t_seq'), inf int
);
CREATE FUNCTION trig_t_row_count() RETURNS trigger AS $$
BEGIN IF TG_OP = 'INSERT' THEN RAISE NOTICE 'Current SEQUENCE value: %', currval('trig_t_seq'); END IF;
RETURNNEW;
END
$$ LANGUAGE plpgsql;
CREATE TRIGGER trig_t_row_count_trig AFTER INSERT ON trig_t FOR EACH ROW EXECUTE PROCEDURE trig_t_row_count();
INSERT INTO trig_t (inf) VALUES (10);
INSERT INTO trig_t (inf) VALUES (20);
INSERT INTO trig_t (inf) VALUES (30);
ROLLBACK;
Regards.
Hi is there a way wherein I can interface the pg_dump of PostgreSQL Server in Visual basic. I mean for example I want to backup Databases "DB1", "BD12", "DB3" using pg_dump Thank You, Ian I choose Polesoft Lockspam to fight spam, and you? http://www.polesoft.com/refer.html
Paul, > Hi is there a way wherein I can interface the pg_dump of PostgreSQL Server > in Visual basic. > > I mean for example I want to backup Databases "DB1", "BD12", "DB3" using > pg_dump You'd have to run them as shell commands in VB. Not sure if VB has a mechanism for that. -- Josh Berkus Aglio Database Solutions San Francisco