2011-12-14 16 views
6

SQL Server 2008 R2: zwykle tworzymy naszą tabelę, procedurę składowaną i przyznajemy prawa wykonywania użytkownika do procedury składowanej. Nigdy nie musimy przyznawać konkretnych praw do tabel ani widoków, ponieważ jeśli użytkownik może wykonać procedurę składowaną, SQL Server wywnioskuje, że procedura składowana powinna mieć możliwość wykonywania instrukcji select/insert/update. Działa dobrze, ponieważ mamy do czynienia tylko z jednym schematem, ale teraz mamy scenariusz, w którym tabele są w jednym schemacie, ale procedura przechowywana jest w innym. Gdy użytkownik uruchamia procedurę przechowywaną, że pojawia się błąd:Procedura przechowywana wywołująca dane w innym schemacie

Msg 229, Level 14, State 5, Procedure teststoredprocedure, Line 7 The SELECT permission was denied on the object 'testtable', database 'testdatabase', schema 'testschema'.

teststoredprocedure jest w innym schemacie niż testtable. Czy można zezwolić na procedurę składowaną, aby wybrać z tabel, bez przyznawania użytkownikowi uprawnień do tych tabel?

+0

Jeśli jakakolwiek odpowiedź była poprawna lub pomocna, zaakceptuj lub prześlij wiadomość. – Ben

Odpowiedz

2

Trzeba dać właścicielowi procedury przechowywanej WITH GRANT dostęp do stołu .

Ogólnie schemat jest własnością rolę z taką samą nazwę jak schemat, tak aby umożliwić storedprocschema.teststoredprocedure dostęp do tabeli byłoby:

GRANT SELECT on testschema.testtable TO storedprocschema WITH GRANT 

to powinno działać tylko wtedy, gdy stół jest w ta sama baza danych, co proces.

Aby osiągnąć ten sam rezultat z tabeli w innej bazie danych można:

  • Enable „cross łańcuchowym Database własności”

  • Przenieś procedurę do innej bazy danych, i mają Procedura shim w oryginalnej bazie danych, która go nazywa. Następnie zarządzaj uprawnieniami do obu procedur.

0

Tak, jest to możliwe. Oto, co chcesz zrobić:

alter procedure teststoredprocedure 
with execute as 'UserWithPermissions' 
-- rest of stored proc code 

Gdzie UserWithPermissions posiada niezbędne uprawnienia do obiektów bazy danych, które starają się ponownie wykonać operacje CRUD.

Odwrotnie, jeśli kontekst zabezpieczeń użytkownika bazy danych posiada niezbędne uprawnienia, można użyć skrótów do osiągnięcia tego celu, a także:

with execute as self 
Powiązane problemy