Pracuję z MSSQL Server Management Studio 2008 i muszę ujawnić widok stronom trzecim w celu uzgodnienia danych. Utworzyłem odpowiedni widok, ale mam problem z utworzeniem użytkownika i nadaniem mu odpowiednich uprawnień do wyboru z tego widoku.
Postępowałem zgodnie z instrukcjami kreatorów, aby utworzyć login i użytkownika, a następnie dodałem mój widok w sekcji Zabezpieczenia z zaznaczonym polem przyznania. Wszystko wydawało się w porządku, ale kiedy zalogowałem się jako ten użytkownik i spróbowałem zrobić „Wybierz * z MyViewName”, powiedziało mi, że odmówiono zgody na wybór.
Właśnie odtworzyłem użytkownika (tym razem używając SQL zamiast kreatora) i wyraźnie przyznałem uprawnienia do wybierania, a teraz daje mi błąd: Msg 916, Level 14, State 1, Line 2
The server principal "username" is not able to access the database "unrelated_db" under the current security context.
(Nie wiem, dlaczego próbuje uzyskać dostęp do niepowiązanej bazy danych ...)
Naprawdę nie wiem stąd, gdzie mam iść. Ponownie, w zasadzie wszystko, czego potrzebuję, to stworzyć użytkownika, który mogę przekazać stronie trzeciej, aby mógł połączyć się z naszą bazą danych i wybrać z tego widoku.
źródło
Odpowiedzi:
Nie używaj do tego interfejsu użytkownika. To mylący bałagan.
Wydaje mi się, że chcesz utworzyć użytkownika w bazie danych dla określonego loginu, który ma uprawnienia tylko do wyboru z jednego widoku. Skoro masz już utworzone dane logowania:
EDYCJA tutaj jest przykładem skryptu, który doprowadzi do wspomnianego błędu.
Najpierw utwórz tabelę w unrelated_db:
Teraz utwórz względnie ograniczony login:
Teraz utwórz bazę danych, w której będzie wyświetlany widok, i dodaj login jako użytkownik:
Teraz utwórz funkcję, która będzie odwoływać się do tabeli w innej bazie danych, i synonim do drugiej tabeli:
Teraz utwórz lokalny stół:
Teraz utworzyć widok, że odniesienia do stołu, funkcja i synonim, a dotacje
SELECT
dousername
:Teraz spróbuj wykonać jako
username
i wybierz tylko lokalną kolumnę z widoku:Wynik:
Teraz zmień widok, aby nie odwoływał się do żadnych obiektów zewnętrznych, i uruchom
SELECT
ponownie powyższe , i to działa:Zamiast pokazywania nam skryptów dla szczegółów płatności, szczegółów konta i obiektów MyView, może możesz dać nam znać, jeśli to zapytanie zwróci jakiekolwiek wyniki. Można znaleźć odniesienia do różnych obiektów za pośrednictwem widoku katalogu
sys.sql_expression_dependencies
, ale ten widok nie jest idealny - uważam, że zależy to od odświeżenia wszystkich widoków (w przypadku, gdy widoki odwołują się na przykład do innych widoków lub do zmieniającego się schematu) w kolejności być punktualnym.SQL Server nie będzie próbował uzyskać dostępu tylko
unrelated_db
dla zabawy ... musi istnieć pewien związek z tą bazą danych z widoku, którego próbujesz użyć. Niestety, jeśli nie widzimy definicji widoku i więcej szczegółów na temat dotykanych przez nią obiektów, możemy jedynie spekulować. Dwie główne rzeczy, o których myślę, to synonimy lub funkcje, które używają trzech części, ale zobaczenie rzeczywistych skryptów da nam znacznie lepszy pomysł, niż zgadywanie. :-)Możesz także chcieć to sprawdzić
sys.dm_sql_referenced_entities
, jednak funkcja ta nie zwraca nic użytecznego w powyższym przykładzie.źródło
Możesz to sprawdzić, wykonując następujące czynności:
źródło