Domanda

Ciao, ho una tabella su cui ho negato i privilegi SELECT a un utente.
Questa tabella ha un trigger che fa riferimento alla tabella INSERTED, fondamentalmente facendo un

AFTER UPDATE SET <table>.[UPDATED] = getdate() 
  WHERE ROWID IN SELECT ROWID FROM INSERTED

Mi sta dando però un errore, dicendo " SELEZIONA AUTORIZZAZIONI DANNEGGIATE " ;, suppongo a causa del SELEZIONA DA INSERITO.

Come posso negare SELEZIONA, ma consentire al trigger di SELEZIONARE dallo pseudotabile INSERITO?

Grazie in anticipo!

È stato utile?

Soluzione

Valuta di aggiungere una clausola ESEGUI COME in modo che il trigger venga eseguito con le autorizzazioni del proprietario dello schema.

CREATE TRIGGER [dbo].[TR_Product_Update] ON [Product]
   WITH EXECUTE AS OWNER
   AFTER UPDATE
AS
SELECT ProductId
FROM INSERTED

Altri suggerimenti

Perché hai negato la selezione? Che dire di non concedere loro la selezione? C'è una sottile differenza tra negare la selezione e non concederglielo. Inoltre, se si negasse la selezione a uno dei ruoli a livello di sistema, probabilmente anche questo sarebbe parte del problema.

- EDIT -

Nei commenti hai chiesto se SQL Server ha o meno informazioni sul contesto. 2005 fa e puoi vedere come usarlo qui .

  

Variabile di sessione - Context_Info: la sessione è uno strumento potente in qualsiasi linguaggio di programmazione. SQL Server non è un linguaggio di programmazione completo ma supporta la variabile di sessione per la sessione o la connessione corrente. Memorizza il valore della sessione in 128 byte di informazioni binarie.

unisciti alla tabella inserita invece qualcosa del tipo:

update t1
set updated = getdate()
from table1 t1
join inserted i
on i.rowid = t1.rowid

Probabilmente funzionerà anche meglio di una sottoselezione.

Sospetto che il tuo problema sia che la tua stessa istruzione UPDATE richiede l'autorizzazione SELECT.

Ho creato un database di test come segue:

DROP DATABASE triggerPermissionTest
CREA DATABASE triggerPermissionTest
GO
USE triggerPermissionTest
GO
CREA UTENTE foo DA LOGIN tester
GO
CREATE TABLE triggerTable (id int)
GO
Trigger DENY SELECT ON Tabella per foo
AGGIORNAMENTO CONCESSIONE SU trigger Tabella per foo
GO
CREA TRIGGER execAsTrigger ON triggerTable
DOPO L'AGGIORNAMENTO COME SELEZIONA * DA triggerTable
GO
INSERT INTO triggerTable VALUES (1)
GO

e ho provato le seguenti dichiarazioni di aggiornamento con il login 'tester':

UPDATE triggerTable SET id = 2
GO
UPDATE triggerTable SET id = id * 2
GO

Il primo viene eseguito correttamente e il trigger viene eseguito (fornendo i risultati di select * da triggerTable all'utente senza autorizzazioni di selezione, dimostrando che è riuscito a eseguire una selezione).

Il secondo mi dà un errore affermando che non ho l'autorizzazione di selezione su triggerTable (perché deve selezionare da triggerTable per ottenere il valore di id per eseguire l'aggiornamento).

Questo mi porta a concludere che il trigger è secondario al problema e l'istruzione UPDATE è la causa del problema di autorizzazione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top