2010-02-03 4 views
5

Ich benutze Sql Server 2008 und habe eine Prozedur, die sp_executesql verwendet. Ich bekomme den folgenden Fehler beim Ausführen der Prozedur durch ASP.NET:Fehlermeldung "select permission denied" bei Verwendung von sp_executesql in proc (Sql Server 2008)

Die SELECT-Berechtigung wurde für das Objekt 'MyTable', Datenbank 'MyDatabase', Schema 'Dbo' verweigert.

Ich habe viele Untersuchungen dazu durchgeführt und die meisten Leute verweisen auf die Tatsache, dass ich eine Auswahlberechtigung für die zugrunde liegende Tabelle gewähren muss, aus der meine dynamische Abfrage liest. Nun, ich habe dies getan, und es scheint noch nicht an die Arbeit:

select object_name(major_id) as object, 
user_name(grantee_principal_id) as grantee, 
user_name(grantor_principal_id) as grantor, 
permission_name, 
state_desc 
from sys.database_permissions 
where major_id = object_id('User') and 
class = 1 
Results: 
MyTable public dbo SELECT GRANT 
MyTable guest dbo SELECT GRANT 
MyTable myuser dbo SELECT GRANT 
MyTable NT AUTHORITY\NETWORK SERVICE dbo SELECT GRANT 

Wie Sie sehen können, habe ich viel des Guten gegangen zu versuchen, wählen Sie auf der zugrunde liegenden Tabelle zu gewähren. Ich habe sogar mein Proc down neu geschrieben, so dass es nur auf MyTable im dynamischen sql verweist. Ich habe sogar allen oben genannten Benutzern die Erlaubnis erteilt, auf dem Proc auszuführen ... Kein Glück.

Der "myuser" oben ist der Benutzername in meinem Connectionstring in der web.config.

Fehle ich hier etwas?

Danke! Dave

+1

Ist in der gespeicherten Prozedur ein 'WITH EXECUTE AS' definiert? – Aaronaught

+0

Ja ... versuchte es mit "MyUser", Anrufer, Selbst, Besitzer. Gibt es noch andere, die ich vermisse? Lustige Sache ist, dass, wenn ich MyUser verwende, dann wirft es den gleichen Fehler in Management Studio Abfragefenster (während ohne dies nicht) – Dave

Antwort

4

Ich fand es heraus. Veröffentlichen Sie dies für alle anderen, die darauf stoßen.

1) Zuerst bemerkte ich, dass mein dbo-Benutzer keinen Login-Namen hatte. Sie können dies sehen, indem Sie mit der rechten Maustaste auf den dbo-Benutzer im Ordner Sicherheit/Benutzer des dbo-Benutzers klicken und auf Eigenschaften klicken. Im ausgegrauten Bereich sollten Sie einen Benutzernamen (dbo) und einen Login-Namen (sa) angeben. Ich denke, das passiert normalerweise, wenn Sie Ihre Datenbank oder etwas wiederherstellen (nicht sicher). Wie auch immer, wenn Sie nicht Login-Namen sehen, führen Sie einfach das Skript in der Datenbank mit dem Thema:

sp_changedbowner ‚sa‘

Dies macht nur dbo den Besitzer der Datenbank (oder so ähnlich). Der Grund, warum ich das herausgefunden habe, war, weil ich versucht habe, einige der Berechtigungen wie "db_datareader", "db_datawriter" über diese GUI-Schnittstelle zu speichern, aber einen Fehler ausgegeben habe, der besagt, dass der Anmeldename erforderlich ist. Ich denke, dbo sollte db_owner überprüft haben (meins tut) und ich denke, das übertrumpft sowieso alle anderen.

2) Um mein Proc zur Arbeit zu bringen, musste ich am Ende des Proc "mit execute as owner" hinzufügen. Ich habe das schon einmal versucht, aber ich denke, dass es wegen meiner ersten Ausgabe # 1 nicht funktioniert hat. Procs werden normalerweise unter dem Besitzer des Procs, aber nicht innerhalb von dynamischen SQL-Prozeduren ausgeführt. Diese werden im Kontext des Benutzers ausgeführt, der den Prozess ausführt. Für mich ist das seltsam, weil ich denke, dass ich das im dynamischen sql hinzufügen müsste (was ich probiert habe), aber es muss im proc selbst sein (gehe Abbildung?)

3) Wahrscheinlich würde nicht weh tun zur Ausführung dieses Skripts auch:

Zuschuss auf ‚MyTable‘ auf ‚MyUser‘ wählt

für jede Tabelle in der dynamischen sQL verwendet.

Hoffe das hilft ...

hier einige Verweise auf diese gleiche Problem:

http://www.jimmcleod.net/blog/index.php/2007/05/15/sp_executesql-breaks-chain-of-ownership-in-sql-server-2000/

http://kbalertz.com/301299/Security-Context-Dynamic-Statements-Inside-Stored-Procedure.aspx

http://www.mssqltips.com/tipprint.asp?tip=1822

+1

Sie sollten Ihre Antwort als die richtige markieren. –

0

Was mir war geholfen hat:

In SQL Management Studio mit der rechten Maustaste auf die Stored Procedure und wählen Sie Properties und auf der Seite Permission pro Abstimmung mit dem betreffenden Benutzer. Der relevante Benutzer hängt von Ihrer SQL-Verbindungszeichenfolge ab: Wenn Sie die Windows-Authentifizierung verwenden, ist dies der Windows-Benutzer (der bei entsprechender Konfiguration ASPNET sein kann). Andernfalls ist es der SQL-Benutzer, den Sie in Ihrer Verbindungszeichenfolge angegeben haben. Die Berechtigung, die Sie erteilen müssen, ist Ausführberechtigung.

Verwandte Themen