Exemples
Dans ce cas, l'utilisateur JOE
a seulement besoin du privilège SELECT
sur la table t
. Si la table avait été créée avec les privilèges de l'utilisateur appelant (INVOKER
), le privilège EXECUTE
pour la table sur la fonction f
devrait également être accordé.
SET TERM ^;
CREATE FUNCTION f() RETURNS INT
AS
BEGIN
RETURN 3;
END^
SET TERM ;^
CREATE TABLE t (
i INTEGER,
c COMPUTED BY (i + f())
)
SQL SECURITY DEFINER;
INSERT INTO t VALUES (2);
GRANT SELECT ON TABLE t TO USER joe;
COMMIT;
CONNECT 'inet://localhost:test' USER joe PASSWORD 'pas';
SELECT * FROM t;
Dans ce cas, l'utilisateur JOE
n'a besoin que du privilège EXECUTE
sur la procédure p
. Si la procédure avait été créée avec des privilèges d'utilisateur appelant (option INVOKER
), le privilège INSERT
pour la procédure p sur la table t
devrait également être accordé.
CREATE TABLE t (i INTEGER);
SET TERM ^;
CREATE PROCEDURE p (i INTEGER)
SQL SECURITY DEFINER
AS
BEGIN
INSERT INTO t VALUES (:i);
END^
SET TERM ;^
GRANT EXECUTE ON PROCEDURE p TO USER joe;
COMMIT;
CONNECT 'inet://localhost:test' USER joe PASSWORD 'pas';
EXECUTE PROCEDURE p(1);
Dans ce cas, l'utilisateur JOE
a seulement besoin du privilège EXECUTE
pour la fonction f
. Si la fonction avait été créée avec des privilèges d'utilisateur appelant (option INVOKER
), le privilège SELECT
pour la fonction f
sur la table t
devrait également être accordé.
CREATE TABLE t (i INTEGER PRIMARY KEY, j INTEGER);
INSERT INTO t(i, j) VALUES(1, 2);
INSERT INTO t(i, j) VALUES(2, 5);
COMMIT;
SET TERM ^;
CREATE FUNCTION f (i INTEGER)
SQL SECURITY DEFINER
AS
DECLARE j INTEGER DEFAULT NULL;
BEGIN
SELECT j
FROM t
WHERE i = :i
INTO j;
RETURN COALESCE(j, 0);
END^
SET TERM ;^
GRANT EXECUTE ON FUNCTION f TO USER joe;
COMMIT;
CONNECT 'inet://localhost:test' USER joe PASSWORD 'pas';
SELECT f(1) AS j FROM RDB$DATABASE;
Dans ce cas, l'utilisateur JOE
a seulement besoin du privilège INSERT
sur la table tr
. Si le déclencheur avait été créé avec les privilèges de l'utilisateur appelant (option INVOKER
), alors le privilège INSERT
pour le déclencheur tr_ins
sur la table t
devrait également être accordé.
CREATE TABLE tr (i INTEGER);
CREATE TABLE t (i INTEGER);
SET TERM ^;
CREATE TRIGGER tr_ins FOR tr AFTER INSERT
SQL SECURITY DEFINER
AS
BEGIN
INSERT INTO t(i) VALUES(NEW.i);
END^
SET TERM ;^
GRANT INSERT ON TABLE tr TO USER joe;
COMMIT;
CONNECT 'inet://localhost:test' USER joe PASSWORD 'pas';
INSERT INTO tr(i) VALUES(2);
COMMIT;
Le même résultat peut être obtenu en spécifiant SQL SECURITY DEFINER pour la table tr.
CREATE TABLE tr (i INTEGER) SQL SECURITY DEFINER;
CREATE TABLE t (i INTEGER);
SET TERM ^;
CREATE TRIGGER tr_ins FOR tr AFTER INSERT
AS
BEGIN
INSERT INTO t(i) VALUES(NEW.i);
END^
SET TERM ;^
GRANT INSERT ON TABLE tr TO USER joe;
COMMIT;
CONNECT 'inet://localhost:test' USER joe PASSWORD 'pas';
INSERT INTO tr(i) VALUES(2);
COMMIT;
SQL SECURITY
, l'instruction suivante doit être exécutée pour hériter des privilèges d'exécution de la table.ALTER TRIGGER tr_ins DROP SQL SECURITY;
Dans ce cas, l'utilisateur JOE n'a besoin que du privilège EXECUTE
sur le paquet pk
. Si le paquet avait été créé avec des privilèges d'utilisateur appelant (l'option INVOKER
), il devrait également donner le privilège INSERT
pour le paquet pk
sur la table t
.
CREATE TABLE t (i INTEGER);
SET TERM ^;
CREATE PACKAGE pk
SQL SECURITY DEFINER
AS
BEGIN
FUNCTION f(i INTEGER) RETURNS INT;
END^
CREATE PACKAGE BODY pk
AS
BEGIN
FUNCTION f(i INTEGER) RETURNS INT
AS
BEGIN
INSERT INTO t VALUES (:i);
RETURN i + 1;
END
END^
SET TERM ;^
GRANT EXECUTE ON PACKAGE pk TO USER joe;
COMMIT;
CONNECT 'inet://localhost:test' USER joe PASSWORD 'pas';
SELECT pk.f(3) FROM rdb$database;
Après avoir exécuté cette instruction PSQL, les modules seront créés par défaut avec l'option `SQL SECURITY DEFINER'.
ALTER DATABASE SET DEFAULT SQL SECURITY DEFINER;
Rôles
Rôle (role) Un objet de base de données représentant un ensemble de privilèges. Les rôles mettent en ouvre le concept de gestion de la sécurité au niveau du groupe. Un ensemble de privilèges est accordé à un rôle, puis le rôle peut être accordé ou révoqué à un ou plusieurs utilisateurs.
Un utilisateur à qui l'on accorde un rôle doit le spécifier lors de la connexion afin de recevoir ses privilèges, ou le rôle doit être accordé en utilisant le mot-clé DEFAULT
. Tout autre privilège accordé à l'utilisateur ne sera pas affecté lorsqu'il se connectera avec le rôle spécifié. La connexion avec plusieurs rôles n'est pas prise en charge, mais vous pouvez attribuer plusieurs rôles par défaut. Vous pouvez changer le rôle actuel avec l'opérateur SET ROLE.
Le rôle peut être accordé par d'autres rôles. En se connectant avec ce rôle, l'utilisateur se verra automatiquement accorder des droits sur tous les rôles émis avec le mot-clé DEFAULT.
Cette section traite de la création et de la suppression des rôles.