Frage

Hallo, ich habe eine Tabelle, in der ich einem Benutzer ausgewählte Berechtigungen verweigert habe.
Diese Tabelle verfügt

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

Es gibt mir jedoch einen Fehler mit der Aussage "SELECT -Berechtigungen verweigert".

Wie kann ich den Auswählen verweigern, aber den Auslöser aus dem eingefügten Pseudotablen auswählen?

Danke im Voraus!

War es hilfreich?

Lösung

Erwägen Sie ein Hinzufügen eines Ausführen als Klausel, so dass der Abzug mit den Berechtigungen des Schemasbesitzers läuft.

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

Andere Tipps

Warum haben Sie ausgewählt? Was ist, wenn sie ihnen einfach keine Auswahl gewähren? Es gibt einen subtilen Unterschied zwischen der Verweigerung der Auswahl und dem einfach nicht gewähren ihnen ihnen. Wenn Sie die Auswahl einer der Rollen der Systemebene verweigern, wäre dies wahrscheinlich auch Teil des Problems.

--BEARBEITEN--

In den Kommentaren haben Sie gefragt, ob SQL Server über Kontextinformationen verfügt oder nicht. 2005 tut und Sie können sehen, wie man es benutzt hier.

Sitzungsvariable - context_info: Sitzung ist ein leistungsstarkes Tool in einer der Programmiersprache. SQL-Server ist keine vollständige Fededge-Programmiersprache, unterstützt jedoch die Sitzungsvariable für die aktuelle Sitzung oder Verbindung. Es speichert den Wert der Sitzung in 128 Byte binärer Informationen.

Verbinden Sie sich stattdessen mit der eingefügten Tabelle so etwas wie:

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

Dies wird wahrscheinlich auch besser als eine Unterauswahl durchführen.

Ich vermute, Ihr Problem ist, dass Ihre Aktualisierungsrechnung selbst die Auswahlberechtigung erfordert.

Ich habe wie folgt eine Testdatenbank erstellt:

DROP DATABASE triggerPermissionTest
CREATE DATABASE triggerPermissionTest
GO
USE triggerPermissionTest
GO
CREATE USER foo FROM LOGIN tester
GO
CREATE TABLE triggerTable (id int)
GO
DENY SELECT ON triggerTable to foo
GRANT UPDATE ON triggerTable to foo
GO
CREATE TRIGGER execAsTrigger ON triggerTable
AFTER UPDATE AS SELECT * FROM triggerTable
GO
INSERT INTO triggerTable VALUES (1)
GO

und ausprobiert die folgenden Aktualisierungsanweisungen mit der Anmeldung "Tester":

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

Der erste wird gut ausgeführt und der Auslöser wird ausgeführt (die Ergebnisse von Select * von TriggterTable to the Benutzer ohne ausgewählte Berechtigungen bereitgestellt, um zu zeigen, dass er eine Auswahl geschafft hat).

Der zweite gibt mir einen Fehler, der besagt, dass ich keine ausgewählte Berechtigung für Triggertable habe (da er aus Triggertierbar auswählen muss, um den Wert der ID für die Aktualisierung zu erhalten).

Dies führt mich zu dem Schluss, dass der Auslöser das Problem und die Update -Erklärung der Ursache für das Problem der Erlaubnis ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top