Servidor SQL: cómo escribir el desencadenador en una tabla con SELECT denegado
-
06-07-2019 - |
Pregunta
Hola, tengo una tabla en la que he negado los privilegios SELECT a un usuario.
Esta tabla tiene un activador que hace referencia a la tabla INSERTED, básicamente haciendo un
AFTER UPDATE SET <table>.[UPDATED] = getdate()
WHERE ROWID IN SELECT ROWID FROM INSERTED
Sin embargo, me está dando un error, diciendo "SELECCIONE PERMISOS DEnegados", supongo que debido a SELECCIONAR DESDE INSERTADO.
¿Cómo puedo mantener el SELECT denegar, pero permitir que el disparador SELECCIONE desde el pseudotable INSERTADO?
¡Gracias de antemano!
Solución
Considere agregar una cláusula EJECUTAR COMO para que el activador se ejecute con los permisos del propietario del esquema.
CREATE TRIGGER [dbo].[TR_Product_Update] ON [Product]
WITH EXECUTE AS OWNER
AFTER UPDATE
AS
SELECT ProductId
FROM INSERTED
Otros consejos
¿Por qué negó seleccionar? ¿Qué hay de no otorgarles selectos? Existe una sutil diferencia entre negar la selección y simplemente no otorgarla. Además, si negó la selección de cualquiera de los roles de nivel de sistema, entonces eso probablemente también sea parte del problema.
--EDIT--
En los comentarios, preguntó si SQL Server tiene o no información de contexto. 2005 lo hace y puede ver cómo usarlo aquí .
Variable de sesión - Context_Info: Session es una herramienta poderosa en cualquiera de los lenguajes de programación. SQL-Server no es un lenguaje de programación completo, pero admite variables de sesión para la sesión o conexión actual. Almacena el valor de la sesión en 128 bytes de información binaria.
unirse a la tabla insertada en lugar de algo como:
update t1
set updated = getdate()
from table1 t1
join inserted i
on i.rowid = t1.rowid
Esto probablemente también funcionará mejor que una subselección de todos modos.
Sospecho que su problema es que su propia declaración ACTUALIZACIÓN requiere el permiso SELECCIONAR.
Creé una base de datos de prueba de la siguiente manera:
CREATE DATABASE triggerPermissionTest
IR
USE triggerPermissionTest
IR
CREAR USUARIO foo DESDE INICIAR SESIÓN
IR
CREATE TABLE triggerTable (id int)
IR
DENY SELECT ON triggerTable to foo
ACTUALIZACIÓN DE LA SUBVENCIÓN EN la tabla desencadenante para foo
IR
CREATE TRIGGER execAsTrigger ON triggerTable
DESPUÉS DE ACTUALIZAR COMO SELECCIONAR * DESDE triggerTable
IR
INSERTAR EN LOS VALORES DE LA TABLA (1)
IR
y probé las siguientes declaraciones de actualización con el inicio de sesión 'probador':
IR
ACTUALIZAR triggerTable SET id = id * 2
IR
El primero se ejecuta bien y el disparador se ejecuta (proporcionando los resultados de select * from triggerTable al usuario sin permisos de selección, lo que demuestra que logró hacer una selección).
El segundo me da un error que indica que no tengo permiso de selección en triggerTable (porque necesita seleccionar triggerTable para obtener el valor de id para hacer la actualización).
Esto me lleva a concluir que el desencadenante es incidental al problema, y ??la declaración ACTUALIZACIÓN es la causa del problema del permiso.