Usar EXECUTE AS para crear conjuntos de permisos personalizados

La especificación de un contexto de ejecución para un módulo puede resultar muy útil para la definición de conjuntos de permisos personalizados. Por ejemplo, algunas acciones como TRUNCATE TABLE no tienen permisos que se puedan conceder. Para poder ejecutar TRUNCATE TABLE, el usuario debe tener permisos ALTER en la tabla especificada. Puede que la concesión de permisos ALTER a un usuario en una tabla no sea lo ideal, pues en realidad el usuario tendrá permisos muy superiores a la posibilidad de truncar una tabla.

Si se incorpora la instrucción TRUNCATE TABLE en un módulo y se especifica la ejecución del módulo como un usuario con permisos para modificar la tabla, se pueden ampliar los permisos para truncar la tabla al usuario al que se concedan permisos EXECUTE en el módulo.

Observe este procedimiento almacenado:

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

Suponga que Mary crea este procedimiento y concede permisos de ejecución en TruncateMyTable a Scott. Cuando Scott ejecuta el procedimiento almacenado, el Database Engine (Motor de base de datos) comprueba los permisos para truncar la tabla como si fuera Mary la que estuviera ejecutando el procedimiento almacenado. Puesto que ella es la propietaria de la tabla, la instrucción se realiza correctamente a pesar de que Scott no dispone de permisos directos en la tabla. Mary ha ampliado a Scott los permisos que deseaba de forma rápida y eficaz, sin darle más permisos de los necesarios para realizar la tarea.