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;