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!

¿Fue útil?

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:

DROP DATABASE triggerPermissionTest
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':

ACTUALIZAR triggerTable SET id = 2
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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top