Benutzer mit den meisten Antworten
Gespeicherte Prozeduren aufrufen - nötigen Rechte?

Frage
-
Hallo,
ich hoffe ihr könnt mir helfen. Ich rufe 2 gespeicherte Prozeduren aus einem .Net Projekt (Visual Studio) auf. Dafür habe ich einen DB Benutzer angelegt, der zunächst nur Mitglied in den Rollen db_datareader und db_datawriter ist. Standardschema ist dbo. Damit er aber diese Prozeduren aufrufen kann, muss ich ihm die Rolle db_owner zusätzlich zuweisen, was ich allerdings ungern möchte. Ich hab auch schon versucht über die Eigenschaften der Gespeicherten Prozeduren die Berechtigungen festzulegen. Habe da den Benutzer angegeben und alle Berechtigungen wie Ausführen, Steuern etc. als Erteilt zugewiesen, aber es hat dennoch nicht funktioniert.
Die eine Prozedur führt Truncate Befehle aus und die andere ein Delete, Insert Into und Truncate.
Was für eine Rolle muss ich ihm zuweisen? Muss ich eine neue kreieren oder hat einer eine andere Idee? Ich kenne mich mit den Rechten im SQL Server leider nicht so gut aus.
Viele Grüße
Scarlet
Antworten
-
Die eine Prozedur führt Truncate Befehle aus und die andere ein Delete, Insert Into und Truncate. ....
... Leider funktioniert dies immer noch nicht.
Hallo Scarlet,
funktioniert nicht heisst ..? Kann es sein, das Du eine Fehlermeldung erhälst? Wäre nett, wenn Du solche Informationen mit postest.
Wenn man einem Benutzer die Ausführungsrechte auf eine Stored Procedure erteilt, greift die "Besitzverkettung" (Ownership Chaining) und das bedeutet, der Benutzer braucht keine Rechte auf die Tabellen, auf die mit DML Befehlen wie Delete zugriffen wird, es geht trotzdem.
Was ich aber bisher überlesen hatte ist, das auch ein TRUNCATE durchgeführt wird, und das zählt nicht wirklich zu DML, sondern ist eher DDL und dafür gilt die Besitzverkettung eben nicht.
Spricht, der Benutzer bräuchte zusätzlich die ALTER Berechtigungen auf den Tabellen und das würde bedeuten, er dürfte die Tabelle(n) nach belieben ändern. Da solltest Du überlegen, ob nicht besser ein DELETE verwendet wird.
Siehe MSDN TRUNCATE TABLE (Transact-SQL) => Berechtigungen.
Olaf Helper
[ Blog] [ Xing] [ MVP]- Als Antwort markiert Scarlet88 Freitag, 14. Februar 2014 14:32
Alle Antworten
-
Hallo Scarlet,
Eine Standardrolle, die nur alle vorhandenen Stored Procedures ausführen darf, gibt es nicht. Am besten definierst Du eine eigene Datenbankrolle und vergibst die die benötigten Rechte; die User fügst Du dann der Rolle hinzu.
Zum Ausführen eine SP braucht man nur EXECUTE Rechte:
GRANT EXECUTE ON [dbo].[spDeineSP] TO [DatabasePrincipalName]
Olaf Helper
[ Blog] [ Xing] [ MVP] -
Hi Olaf,
danke für deine schnelle Antwort. Was muss ich der Rolle für sicherungsfähige Elemente mitgeben? Die Gespeicherten Prozeduren kann man hier auch auswählen und ein Häkchen bei Ausführen setzen. Das müsste doch identisch sein mit deinem obigen Befehl wenn ich mich nicht irre? Oder gebe ich ihm einfach die gleichen Elemente mit wie der Rolle public? Wie gesagt der DB Benutzer muss als einziger der Rolle angehören um die GP auszuführen.
Ich bin was Rollen/Rechte angeht leider unwissend.
VG
Scarlet
-
Oder gebe ich ihm einfach die gleichen Elemente mit wie der Rolle public?
Das ist nicht nötig, jeder User ist immer Mitglied der Gruppe "Public". Du brauchst der eigenen Rolle also nur das Recht fürs Ausführen der Stored Procedure, entweder über die UI, wie Du beschrieben hast oder eben über diesen T-SQL Befehl.Olaf Helper
[ Blog] [ Xing] [ MVP] -
Hi,
ich hab eine eigene Datenbankrolle erstellt. Der Besitzer ist dbo und ich hab bei Rollenmitglieder, den Benutzer hinzugefügt, der letztendlich die GP ausführen soll.
Bei sicherungsfähige Elemente habe ich die beiden GPs(Schema dbo) ausgewählt und bei beiden bei "Ausführen" ein Häkchen gemacht.
Leider funktioniert dies immer noch nicht. Auch nicht wenn ich den T-SQL Befehl ausführe... Ich habe gedacht das reicht. Aber anscheinend fehlt dem Benutzer irgendein Recht. Wenn ich ihn der Rolle db_owner hinzufüge funktioniert es ja. Oder hängt es daran, dass die GP aus einem VS Projekt aus aufgerufen wird?
VG
Scarlet
-
Die eine Prozedur führt Truncate Befehle aus und die andere ein Delete, Insert Into und Truncate. ....
... Leider funktioniert dies immer noch nicht.
Hallo Scarlet,
funktioniert nicht heisst ..? Kann es sein, das Du eine Fehlermeldung erhälst? Wäre nett, wenn Du solche Informationen mit postest.
Wenn man einem Benutzer die Ausführungsrechte auf eine Stored Procedure erteilt, greift die "Besitzverkettung" (Ownership Chaining) und das bedeutet, der Benutzer braucht keine Rechte auf die Tabellen, auf die mit DML Befehlen wie Delete zugriffen wird, es geht trotzdem.
Was ich aber bisher überlesen hatte ist, das auch ein TRUNCATE durchgeführt wird, und das zählt nicht wirklich zu DML, sondern ist eher DDL und dafür gilt die Besitzverkettung eben nicht.
Spricht, der Benutzer bräuchte zusätzlich die ALTER Berechtigungen auf den Tabellen und das würde bedeuten, er dürfte die Tabelle(n) nach belieben ändern. Da solltest Du überlegen, ob nicht besser ein DELETE verwendet wird.
Siehe MSDN TRUNCATE TABLE (Transact-SQL) => Berechtigungen.
Olaf Helper
[ Blog] [ Xing] [ MVP]- Als Antwort markiert Scarlet88 Freitag, 14. Februar 2014 14:32
-
Hallo Olaf,
das mit dem Truncate wird es wahrscheinlich sein. Ich habe mir die Innerexception während des Debuggens angeschaut. Dort steht, dass das Objekt xx, hier die Tabelle nicht gefunden werden kann, weil das Objekt nicht vorhanden ist, oder der Benutzer nicht über die entsprechenden Berechtigungen verfügt. In der GP ist die erste Anweisung ein Truncate auf die genannte Tabelle. Somit müsste es am Truncate liegen. Ich wusste nicht, dass ein Truncate nicht für die Besitzverkettung gilt.
Das hilft mir weiter. Danke :)
VG
Scarlet