CREATE OR REPLACE FUNCTION get_issue_status_user_role() RETURNS TRIGGER AS
$issue_user_role$
DECLARE missue_id integer;
mstatus integer;
mcurr_user integer;
mrole_descrp varchar;
mcan_edit_tkts boolean;
mqueue_id integer;
BEGIN
raise notice 'howdya';
mcan_edit_tkts := False;
-- Check roles for the logged in user 'before update' event
-- get the queue id of the issue being edited. If user present
-- in user_group_id for the queue id in the q_users_roles
-- check the role(s) with status role of the current user
--IF (TG_OP = 'UPDATE') THEN
-- if OLD.description != NEW.description then
missue_id := OLD.id;
mcurr_user := NEW.updated_by;
mqueue_id := NEW.queue_id;
mstatus := OLD.status;
mrole_descrp := (
SELECT roles.description AS mrole_desc FROM rt_issues
LEFT OUTER JOIN queues ON rt_issues.queue_id = queues.id
LEFT OUTER JOIN rt_status ON rt_issues.status = rt_status.id
LEFT OUTER JOIN q_users_roles ON queues.id = q_users_roles.queue_id
LEFT OUTER JOIN roles ON q_users_roles.role_id = roles.id
LEFT OUTER JOIN users_groups ON q_users_roles.user_group_id = users_groups.id
LEFT OUTER JOIN users ON users_groups."user" = users.id
WHERE rt_issues.id = missue_id AND
rt_issues.status = mstatus AND
users_groups."user" = mcurr_user);
--end if;
if mrole_descrp != 'can_change_status' then
mcan_edit_tkts := False;
else
mcan_edit_tkts := True;
end if;
--END IF;
if mcan_edit_tkts then
raise notice 'Edit permitted';
RETURN NEW;
else
raise notice 'No permission to edit this ticket';
RETURN Null; -- result is ignored since this is an AFTER trigger
end if;
END;
$issue_user_role$ LANGUAGE plpgsql;
drop trigger if exists issue_user_role on rt_issues;
CREATE TRIGGER issue_user_role BEFORE UPDATE OR INSERT ON rt_issues FOR EACH ROW EXECUTE PROCEDURE get_issue_status_user_role();
The select statement returns a matching role description from the roles master for the issue status of the queue being updated associated with the role for the current user from the q_users_roles table belonging to the users_groups. The sql gives correct output (role description) when executed using sqlalchemy- core in python api call. This is my first trigger. Where is the syntax error
db1=# select id, first_name from users;
id | first_name
----+------------
1 | ytxz
2 | abcd
(2 rows)
db1=# select * from users_groups;
id | user | group |
----+------+-------+
2 | 2 | 1 |
1 | 1 | 2 |
(2 rows)
db1=# select id, cc_user_ids, status, queue_id, updated_by from rt_issues where id=10;
id | cc_user_ids | status | queue_id | updated_by
----+-------------+--------------+--------+----------+---
10 | [email protected] | 2 | 1 | 2
(1 row)
db1=# select * from rt_status;
id | description | role_id | queue_id |
----+---------------------+---------+----------+
2 | Initial check | 1 | 1 |
3 | Awaiting assignment | 1 | 1 |
1 | New Issue | 1 | 1 |
(3 rows)
db1=# select * from q_users_roles;
id | queue_id | user_group_id | role_id |
----+----------+---------------+---------+
9 | 16 | 1 | 2 |
25 | 21 | 1 | 2 |
26 | 24 | 1 | 2 |
16 | 1 | 1 | 1 |
(4 rows)
db1=# select * from roles;
id | description | xdata
----+----------------------+-------
1 | can_change_status |
2 | can_create_tkts |
(2 rows)
db1=# SELECT roles.description AS mrole_desc FROM rt_issues LEFT OUTER JOIN queues ON rt_issues.queue_id = queues.id LEFT OUTER JOIN rt_status ON rt_issues.status = rt_status.id LEFT OUTER JOIN q_users_roles ON queues.id = q_users_roles.queue_id LEFT OUTER JOIN roles ON q_users_roles.role_id = roles.id LEFT OUTER JOIN users_groups ON q_users_roles.user_group_id = users_groups.id LEFT OUTER JOIN users ON users_groups."user" = users.id WHERE rt_issues.id = 10 AND rt_issues.status = 2 AND users_groups."user" = 1;
mrole_desc
-------------------
can_change_status
(1 row)
db1=# SELECT roles.description AS mrole_desc FROM rt_issues LEFT OUTER JOIN queues ON rt_issues.queue_id = queues.id LEFT OUTER JOIN rt_status ON rt_issues.status = rt_status.id LEFT OUTER JOIN q_users_roles ON queues.id = q_users_roles.queue_id LEFT OUTER JOIN roles ON q_users_roles.role_id = roles.id LEFT OUTER JOIN users_groups ON q_users_roles.user_group_id = users_groups.id LEFT OUTER JOIN users ON users_groups."user" = users.id WHERE rt_issues.id = 10 AND rt_issues.status = 2 AND users_groups."user" = 2;
mrole_desc
------------
(0 rows)
mcan_edit_tktsis always false?..