Utilisation d'EXECUTE AS pour créer des jeux d'autorisations personnalisés

Il peut être très utile de spécifier un contexte d'exécution pour la définition de jeux d'autorisations personnalisés. Par exemple, il n'est pas possible d'accorder des autorisations sur certaines actions comme TRUNCATE TABLE. Pour exécuter TRUNCATE TABLE, l'utilisateur doit disposer d'autorisations ALTER sur la table spécifiée. L'octroi à un utilisateur des autorisations ALTER sur une table est critiquable car celui-ci disposera en réalité d'autorisations plus étendues que celles lui permettant de tronquer une table.

En intégrant l'instruction TRUNCATE TABLE dans un module et en spécifiant que ce module s'exécute en tant qu'utilisateur disposant des autorisations de modifier la table, vous pouvez étendre les autorisations de tronquer la table à l'utilisateur auquel vous accordez les autorisations EXECUTE sur le module.

Envisageons la procédure stockée suivante :

CREATE PROCEDURE TruncateMyTable
WITH EXECUTE AS SELF
AS TRUNCATE TABLE MyDB..MyTable;

Supposons que Mary crée cette procédure et accorde des autorisations d'exécution sur TruncateMyTable à Scott. Quand Scott exécute la procédure stockée, le Moteur de base de données vérifie les autorisations de tronquer la table comme si c'était Mary qui exécutait cette procédure. Dans la mesure où Mary est la propriétaire de la table, l'instruction réussit bien que Scott ne dispose pas d'autorisations directes sur la table. Mary a rapidement et efficacement étendu les autorisations requises à Scott, sans lui octroyer des autorisations plus étendues que celles nécessaires pour effectuer la tâche.