вI have three tables. permissions, roles and a third table that references these two tables role_permissions. I want to insert a record into roles and role_permissions table.
How can this be done?
permissions
--------------- -----------
| permission_id | name |
--------------- -----------
| 1 | role_edit |
--------------- -----------
roles
--------------- -----------
| role_id | name |
--------------- -----------
| 1 | admin |
--------------- -----------
role_permissions
--------------- -----------------
| role_id | permission_id |
--------------- -----------------
| 1 | 1 |
--------------- -----------------
CodePudding user response:
At first you insert in roles table, then you insert in role_permissions where role_id
- is a value returned from previous insert, for mysql, for example, is a LAST_INSERT_ID()
function to be used, and permission_id
is a value from permissions.
Like this (for MySql):
INSERT INTO roles(name) VALUES('<some_role>');
INSERT INTO role_permissions(role_id,permission_id) VALUES(SELECT
LAST_INSERT_ID(),1);
CodePudding user response:
As others indicate you must create the roles
and permissions
before you can create role_permissions, assuming appropriate primary and foreign keys are in place. Unfortunately, Postgres does not provide a direct method to obtain the LAST ID for a table, further the last role or permission may often be the one you need. What you need is to put a unique constraint on each of the name columns. Then to create the the role_permissions you can confidently get the appropriate id
from the name
you wish to combine. You join the two tables using those names.
insert into role_permissions(role_id, permission_id)
select role_id, permission_id
from roles r
join permissions p
on ( r.name = 'group1'
and p.name = 'read all'
);
You can also create a procedure that will handle the complete process: insert roles
, insert permissions
and insert role_permissions
given just the names you want to combine.
create or replace
procedure build_role_permissions( role_name_in text
, permission_name_in text
)
language sql
as $$
insert into roles(name)
values(role_name_in)
on conflict (name)
do nothing;
insert into permissions(name)
values(permission_name_in)
on conflict (name)
do nothing;
insert into role_permissions(role_id, permission_id)
select role_id, permission_id
from roles r
join permissions p
on ( r.name = role_name_in
and p.name = permission_name_in
)
on conflict (role_id, permission_id)
do nothing;
$$;
See demo.