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;