pgsql problem - Mailing list pgsql-sql

From Grignon Etienne
Subject pgsql problem
Date
Msg-id 00c801c2dde8$f69de7d0$0201a8c0@zimmer
Whole thread Raw
Responses Re: pgsql problem
List pgsql-sql
Hello,

I use postgresql 7.3.2

This is the code to show my problem :

-3 tables
-1 trigger
-2 stocked procedures
-1 view

-----------

DROP TABLE USERS CASCADE;
CREATE TABLE USERS (
U_ID SERIAL not null,
NAME VARCHAR(30) not null,
constraint PK_USERS primary key (u_id));

DROP TABLE PERMISSIONS CASCADE;
CREATE TABLE PERMISSIONS (
P_ID SERIAL not null,
NAME VARCHAR(30) not null,
constraint PK_PERM primary key (p_id));

DROP TABLE USER_PERM;
CREATE TABLE USER_PERM (
U_ID INT4 not null,
P_ID INT4 not null,
STATE BOOL not null default true,
constraint PK_USER_PERM primary key (U_ID, P_ID),
constraint FK_USER_PERM_USER foreign key (U_ID)
references USERS (U_ID)
on delete cascade on update restrict,
constraint FK_USER_PERM_PERM foreign key (P_ID)
references PERMISSIONS (P_ID)
on delete cascade on update restrict);

INSERT INTO permissions(name) VALUES('delete');
INSERT INTO permissions(name) VALUES('update');
INSERT INTO permissions(name) VALUES('create');

DROP TRIGGER OnCreateUser ON users;
DROP FUNCTION CreateUserTrig();
CREATE FUNCTION CreateUserTrig () RETURNS TRIGGER AS '
DECLARE
BEGIN

RAISE NOTICE ''TRIGGER'';

INSERT INTO user_perm(u_id, p_id)
(SELECT u_id, p_id FROM users, permissions
WHERE u_id = NEW.u_id);

RETURN NEW;
END;
' LANGUAGE 'plpgsql';

CREATE TRIGGER OnCreateUser
AFTER INSERT
ON users FOR EACH ROW
EXECUTE PROCEDURE CreateUserTrig();

CREATE OR REPLACE FUNCTION CreateUser(text, bool, bool, bool) RETURNS int AS
'
DECLARE
Vname ALIAS FOR $1;
Vcreate_state ALIAS FOR $2;
Vupdate_state ALIAS FOR $3;
Vdelete_state ALIAS FOR $4;
tmp record;
BEGIN

INSERT INTO users(name) VALUES(Vname);

RAISE NOTICE ''Begin Of Update Permissions'';

UPDATE user_perm SET
state = Vcreate_state
WHERE u_id = currval(''users_u_id_seq'')
AND p_id = (SELECT p_id FROM permissions WHERE name = ''create'');

UPDATE user_perm SET
state = Vupdate_state
WHERE u_id = currval(''users_u_id_seq'')
AND p_id = (SELECT p_id FROM permissions WHERE name = ''update'');

UPDATE user_perm SET
state = Vdelete_state
WHERE u_id = currval(''users_u_id_seq'')
AND p_id = (SELECT p_id FROM permissions WHERE name = ''delete'');

RAISE NOTICE ''End Of Update Permissions'';

RETURN 0;
END;
' LANGUAGE 'plpgsql';

CREATE OR REPLACE VIEW ShowUserPerms AS
SELECT
U.u_id,
U.name,
P.p_id,
P.name AS "permission",
UP.state
FROM users AS U, user_perm AS UP, permissions AS P
WHERE UP.u_id = U.u_id AND P.p_id = UP.p_id ORDER BY name;

------------

test=# SELECT createuser('toto', true, true, true);
NOTICE:  Begin Of Update Permissions
NOTICE:  End Of Update Permissions
NOTICE:  TRIGGERcreateuser
------------         0
(1 row)
test=#


My problem is that the trigger for the insert is executed at the end of the
procedure, so I can't do the update of the user's permissions.

For me and my co-workers, the NOTICE TRIGGER should be before Begin Of
Update Permissions.

Could you explain to me how is it working ?

--
GRIGNON Etienne
Epitech Promo 2005
egrignon@egrignon.com
http://www.egrignon.com
http://www.hans-zimmer.com



pgsql-sql by date:

Previous
From: Tom Lane
Date:
Subject: Re: Relation "pg_relcheck"
Next
From: "A.M."
Date:
Subject: timestamp output as seconds since epoch?