it-swarm.com.de

SQL Server - Wie erteile ich SELECT-Berechtigungen für View, die auf Daten in Schemas von verschiedenen Eigentümern zugreifen?

Ich benötige Hilfe bei der Behebung eines Problems mit Berechtigungen in meiner Datenbank.

Dies ist das Szenario:

1 Datenbank

4 Schemata :

  • schemaA ; Besitzer dbo
  • schemaB ; owner ownerX
  • schemaC ; owner ownerX
  • schemaD ; owner ownerX

In schemaD habe ich eine Ansicht mit dem Namen viewABC , die Informationen aus Tabellen abruft und Ansichten, die Schemas zugewiesen sind schemaA , schemaB e schemaC .

Ein Benutzer userX hat die Berechtigung SELECT für viewABC .

Mit folgendem Befehl erteile ich die Erlaubnis:

GRANT SELECT ON schemaD.viewABC TO userX;

Wenn userX versucht, ein SELECT für die Ansicht auf folgende Weise auszuführen:

SELECT * FROM schemaD.viewABC;

Wir bekommen den Fehler:

Die SELECT-Berechtigung wurde für das Objekt 'tableA', die Datenbank 'MyDatabase' und das Schema 'schemaA' verweigert.

Ich verstehe, dass der Fehler auftritt, weil tableA in einem anderen Schema mit einem anderen Eigentümer (dbo statt ownerX) ist ) , und SQLServer wendet userX Berechtigungen an, um den Zugriff zu gewähren oder zu verweigern . Sobald userX keinen expliziten Zugriff auf tableA hat, gibt die Abfrageausführung einen Fehler zurück.

Wie kann man dies lösen , ohne die SELECT-Berechtigung für tableA für userX zu erteilen?

6
Emerson JS

Basierend auf einem der Vorschläge, die Dan Guzman mir in Ihrer Antwort gegeben hat, und nachdem ich diese gelesen habe Frage habe ich eine Problemumgehung gefunden mein Problem.

Anscheinend gibt es im beschriebenen Szenario keine Möglichkeit, userX SELECT die Berechtigung in der viewABC ohne Erteilung auch SELECT-Berechtigung für Tabelle A .

Die Lösung, die ich fand, war die folgende:

  • in schemaD habe ich eine Tabellenwertfunktion erstellt, die denselben Datensatzsatz von zurückgibt. viewABC - trotz ownerX ist nicht Eigentümer von schemaA , er hat die Berechtigung SELECT für tableA

  • das EXECUTE ASKlausel wurde verwendet, um sicherzustellen, dass bei jeder Ausführung der Funktion ownerX-Berechtigungen verwendet werden - in diesem Zusammenhang spielt dies keine Rolle die Berechtigung, die userX für tableA hat

  • to userX wurde die Berechtigung SELECT in der erstellten Funktion erteilt - keine EXECUTE Berechtigung, da die Funktion eine Tabelle zurückgibt


Der Beispielcode für die Tabellenwertfunktion :

CREATE FUNCTION schemaD.udfABC ()
RETURNS @tabABC TABLE (
  fieldA INT NOT NULL, fieldB INT NOT NULL, fieldC INT NOT NULL
)
WITH EXECUTE AS OWNER
AS
BEGIN
  INSERT INTO @tabABC (fieldA, fieldB, fieldC)
    SELECT a.fieldA, b.fieldB, c.fieldC
      FROM schemaA.tableA a
     INNER JOIN schemaB.tableB b ON a.id = b.idA
     INNER JOIN schemaC.tableC c ON b.id = c.idB;

  RETURN;  
END

Erteilung der Berechtigung SELECT:

GRANT SELECT ON schemaD.udfABC TO userX;

Jetzt kann userX diesen Befehl verwenden, um Daten abzurufen:

SELECT * FROM schemaD.udfABC();
6
Emerson JS

Ich kann mir keinen Weg vorstellen, um zu vermeiden, dass SELECT Berechtigungen aufgrund der unterbrochenen Besitzkette in den zugrunde liegenden Objekten der Ansicht erteilt werden. Eine Lösung besteht darin, den Eigentümer von TableA in ownerX zu ändern, damit die Ansichtseigentumskette nicht unterbrochen wird:

ALTER AUTHORIZATION ON OBJECT::dbo.tableA TO ownerX;

Beachten Sie, dass dies ownerX CONTROL Berechtigungen für dbo.tableA erteilt. Wenn dies nicht akzeptabel ist, müssen Sie stattdessen ein Modul verwenden (z. B. eine Funktion mit Tabellenwert) und es mit einem Zertifikat signieren, das auf einem Benutzer basiert, der über die erforderlichen Objektberechtigungen SELECT verfügt.

4
Dan Guzman