2010-02-11 7 views
17

ich die folgende Fehlermeldung erhalten, wenn Sie eine gespeicherte Prozedur aufrufen, die einen Tabellenwertparameter als einer der Parameter hatTabelle Wertparameter in einer gespeicherten Prozedur wird Berechtigungen Fehler verweigert ausführen

Die EXECUTE Berechtigung für das Objekt ‚validationerrors verweigert wurde '

validationerrors ist ein TVP mit der folgenden Anweisung erstellt:

CREATE TYPE [dbo].[ValidationErrors] AS TABLE(
    [ErrorMessage] [varchar](255) NOT NULL 
) 

der Benutzer ausführen der gespeicherten Prozedur hat Berechtigungen für die gespeicherte Prozedur auszuführen. Ich bekomme jedoch immer noch den obigen Fehler. Irgendwelche Ideen?

Antwort

32

Ich denke, Sie müssen auch den Benutzer Berechtigungen für den Typ gewähren.

Referenzen für Berechtigungen Typen Gewähren von:
SQL 2005
SQL 2008

Update:
Re: warum Sie Berechtigungen für den Typ gewähren müssen, wenn Sie Berechtigungen für den sproc haben. Ich weiß nicht, den endgültige Grund, aber BOL sagt:

Im Gegensatz zu benutzerdefinierten Typen von mit sp_addtype erstellt, wird die öffentliche Datenbank Rolle nicht automatisch REFERENCES-Berechtigung für Arten gewährt, die erstellt werden Verwenden von CREATE TYPE. Diese Erlaubnis muss separat erteilt werden.

Update 2: Gewähre Berechtigungen EXECUTE, dann würden Sie dies in SSMS ausführen:

GRANT EXECUTE ON TYPE::dbo.ValidationErrors TO SomeUser; 
+0

Ich gewährte dem Objekt die "Kontrolle" -Erlaubnis und es scheint jetzt gut zu funktionieren. Das einfache Hinzufügen von "Referenzen" und "Ansichtsdefinition" hat nicht geholfen. Persönlich verstehe ich die Anforderung nicht, da es ein Typ ist und im Allgemeinen, wenn die Ausführung der gespeicherten Prozedur gewährt wird, müssen referenzierte Objekte keine bestimmten Berechtigungen erhalten. Dies hat jedoch möglicherweise etwas damit zu tun, dass der Benutzer in der Rolle "public" ist. Irgendwelche Gedanken? – chiefbrownbotom

+0

Haben Sie versucht, EXECUTE-Berechtigungen zu erteilen (statt der Kontrolle)? Könnte es wert sein, das zu versuchen, bevor ich auf die Kontrolle – AdaTheDev

+2

Ich sah keinen Platz zu gewähren ausführen von der SQL-Management-Studio. Ich habe nur die oben aufgeführten gesehen. Muss ich t-sql verwenden, um dies zu gewähren? – chiefbrownbotom

2

Wie @chiefbrownbotom sagt, der Grund, warum Sie die Berechtigungen benötigen ausführen auf der Tabellentyp ist, dass Die Tabelle wird vor (und daher außerhalb von) dem Aufruf des Proc erstellt. Um dies zu veranschaulichen, führen Sie eine SQL Profiler-Ablaufverfolgung aus und rufen Sie Ihre Prozedur auf. Sie werden etwas sehen, die Sie vielleicht überraschen ...

DECLARE @p1 TABLE AS YourTableType 
INSERT INTO @p1 (col1, col2, col3) VALUES ('val1','val2','val3') 
INSERT INTO @p1 (col1, col2, col3) VALUES ('val1','val2','val3') 
... 
EXEC usp_YourStoredProc @p1 
1

Grant-Steuerung auf TYPE :: schema.mytabletype zu RoleOrMember

Das ist für mich gearbeitet; Vielen Dank an @chiefbrownbotom im obigen Kommentar.

Verwandte Themen