FirebirdSQL logo

Exemples

Example 1. Création d’une table avec des privilèges définis par l’utilisateur

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;
Example 2. Création d’une procédure avec des privilèges définis par l’utilisateur

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);
Example 3. Création d’une fonction avec des privilèges définis par l’utilisateur

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;
Example 4. Création d’un déclencheur avec des privilèges définis par l’utilisateur

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;
Example 5. Suppression des privilèges d’exécution d’un déclencheur
Si le déclencheur est explicitement défini sur l’option 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;
Example 6. Création d’un paquet avec des privilèges définis par l’utilisateur

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;
Example 7. Modification des privilèges d’exécution par défaut

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;