Entify Framework-Einfügungen erfordern Select-Berechtigungen

8

Wir verwenden LINQ to Entities, um Einträge in eine Audit-Datenbank (SQL Server 2008) zu schreiben. Da es sich um eine dedizierte Audit-Datenbank handelt, fügen wir nur Zeilen ein - wir lesen niemals Zeilen, aktualisieren oder löschen sie aus der Überwachungsanwendung.

Die Auditing-Anwendung sollte das Prinzip der geringsten Berechtigung verwenden, also möchten wir nicht mehr Berechtigungen erteilen, als sie benötigen. Da wir niemals Zeilen lesen, möchten wir keine Berechtigungen zur Auswahl aus der Datenbank gewähren.

Wenn wir jedoch versuchen, die Daten zu schreiben, erhalten wir folgende Fehlermeldung:

  

Die SELECT-Berechtigung wurde für das Objekt 'AuditEvent', Datenbank 'IdentifyAudit', Schema 'dbo' verweigert.

Der Code ist ziemlich Standard-EF-Code:

%Vor%

Warum brauchen wir die SELECT-Berechtigung, um in die Tabelle zu schreiben, und noch wichtiger: Gibt es eine Möglichkeit, diese Anforderung zu entfernen?

BEARBEITEN

SQL Profiler zeigt, dass diese Anweisung ausgeführt wird:

%Vor%

Dies erklärt, warum SELECT-Berechtigungen benötigt werden, da die Operation die automatisch generierte ID der eingefügten Zeile zurückgibt.

Jetzt bleibt die Frage: Ich muss die ID der Reihe, die ich gerade eingefügt habe, nicht wissen, also kann ich diese Funktion irgendwie ausschalten?

    
Mark Seemann 10.11.2009, 08:54
quelle

2 Antworten

8

Standardmäßig ändert sich nach dem Hinzufügen einer Entität zum ObjectContext und dem Aufruf von SaveChanges der Status dieses Objekts von "Zu Unverändert" und wird weiterhin von ObjectContext verfolgt. Aus diesem Grund benötigt EF diese ID, um Änderungen daran verfolgen zu können.

Entity Keys und hinzugefügte Objekte:

  

1. Das Entitätsobjekt wird konstruiert.   An diesem Punkt die Schlüsseleigenschaften alle   habe Standardwerte, entweder Null oder 0.

     

2. Das neue Objekt wird dem hinzugefügt   ObjectContext entweder durch Aufruf   AddObject oder eine der Entitäten   Set-spezifische Add-Methoden in der   Kontext oder durch den Aufruf von Add auf a   Navigationseigenschaft, die ein zurückgibt   EntityCollection.

     

An diesem Punkt, Objektdienste   generiert einen temporären Schlüssel, der ist   verwendet, um die Objekte in der   ObjectStateManager.

     

3.SaveChanges wird am aufgerufen   ObjectContext.

     

Eine INSERT-Anweisung wird von generiert   Entity Services und wird auf der   Datenquelle.

     

4.Wenn die INSERT-Operation erfolgreich ist,   Servergenerierte Werte werden geschrieben   zurück zum ObjectStateEntry.

     

5.Der ObjectStateEntry aktualisiert die   Objekt mit dem Server generiert   Wert.

     

6.Wenn AcceptChanges auf dem aufgerufen wird   ObjectStateEntry, eine permanente   EntityKey wird mit dem neuen berechnet   Server-generierte Werte.

Soweit ich weiß, ist es nicht möglich, diese Funktion von ObjectContext zu wechseln, und ich sehe keine "nette" Lösung für dieses Problem: Eine Möglichkeit, dies zu vermeiden, ist die Verwendung Ihrer eigenen gespeicherten Prozeduren Einfügen von Entitäten (wenn möglich) ( Ссылка ).

Wenn es keine vom Server generierten IDs gibt, denke ich, dass select query nicht ausgeführt wird (wiederum, wenn Sie dbs ändern können und wenn Sie sich mit der Generierung von IDs beschäftigen wollen).

    
Misha N. 10.11.2009, 11:44
quelle
3

Aber das ist eine alte Frage, aber für die Zukunft wird vielleicht irgendjemand benutzen. Eine Möglichkeit besteht darin, eine Auswahlberechtigung nur für ID-Felder zu erteilen.

    
user1429899 13.02.2014 06:14
quelle