Mam wystąpienie programu SQL Server 2012 z kilkoma bazami danych. W jednym z nich stworzyłem widok, który wybiera tabele w więcej niż bazie danych.
Chcę, aby użytkownik mógł wybrać ten widok, ale nie może wybierać swoich tabel. Widok został utworzony dokładnie dlatego, że użytkownik nie może wybrać tabel.
Przeczytałem /programming/368414/grant-select-on-a-view-not-base-table i http://msdn.microsoft.com/en-us/library/ms188676. aspx i nadal nie działa.
Jeśli zrobię a GRANT SELECT TABLE TO USER
dla wszystkich tabel, użytkownik może wybrać widok. Ale jeśli odwołam do dowolnego stołu, nie powiedzie się.
To powinna być łatwa procedura, ale mam problem z jej uruchomieniem. Widziałem to wcześniej (właściciel instancji dał mi dostęp do widoku i nie zrobił tego z tabelami), ale nie jestem w stanie tego zrobić ani znaleźć kogoś, kto wie jak.
Czy ktoś mógłby mi dostarczyć tutorial, jak to zrobić, lub przykład kodu?
Gdy użytkownik SELECTs
wyświetli widok, dostaję komunikat:
Odmówiono uprawnienia SELECT do obiektu
<TABLE>
, bazy danych<DB>
, schematudbo
.
Jeśli udzielę zaznaczenia tej tabeli, komunikat o błędzie zmieni nazwę tabeli na inną tabelę odczytaną przez widok.
źródło
Odpowiedzi:
Jeśli chcesz, aby użytkownicy wybierali z widoku, dlaczego udzielasz tabeli? Przez „odwołanie” masz na myśli wprost odwołanie / odrzucenie? Odmowa zastąpi grant, więc jest twój problem ... powinieneś być w stanie to zrobić, dodając grant do widoku i nie robiąc nic w żaden sposób na stołach.
Oto szybki przykład, w którym
SELECT
nie podano wyraźnie tabeli, ale widok. Użytkownik może wybrać z widoku, ale nie z tabeli.Należy pamiętać, że zakłada to, że
foo
nie przyznano podwyższonych uprawnień poprzez wyraźne uprawnienia do schematu lub bazy danych, ani poprzez członkostwo w roli lub grupie.Ponieważ używasz tabel w wielu bazach danych (przepraszam, początkowo brakowało mi końca pierwszego zdania), możesz również potrzebować wyraźnych przydziałów dla tabel w bazie danych, w których widok nie istnieje. Aby uniknąć przyznawania wyboru tabelom, możesz utworzyć widok w każdej bazie danych, a następnie dołączyć widoki.
Utwórz dwie bazy danych i login:
W bazie danych
d1
utwórz użytkownika, a następnie utwórz tabelę i prosty widok dla tej tabeli. Przyznaj użytkownikowi wybór tylko w stosunku do widoku:Teraz w drugiej bazie danych utwórz użytkownika, a następnie utwórz kolejną tabelę i widok, który łączy tę tabelę z widokiem w
d1
. Przyznaj zaznacz tylko do widoku.Teraz uruchom nowe okno zapytania i zmień dane logowania do logowania
blat
(EXECUTE AS
tutaj nie działa). Następnie uruchom następujące polecenie w kontekście dowolnej bazy danych i powinno działać dobrze:Oba powinny przynieść błędy Msg 229:
Wyniki:
źródło
Odpowiedź wiki społeczności pierwotnie dodana do pytania przez autora:
Oto co zrobiłem:
SELECT
dostęp użytkownikowi w tym widoku, a NIE żadnej z jego tabel. Użytkownikowi udało się wykonać zapytanie dotyczące widoku, a nie tabel.SELECT
dostępu do tego drugiego widoku, a także NIE do żadnej tabeli. Użytkownik mógł pomyślnie wysłać zapytanie do tego ostatecznego widoku i zobaczyć dane.Myślę, że to dziwne, że widok może wyszukiwać tabele w swojej bazie danych, że użytkownik nie ma bezpośredniego dostępu, ale nie może tego zrobić w tabelach z innej bazy danych. Przynajmniej zadziałało.
źródło
Jeśli aktywujesz
Cross database ownership chaining
dla serwera, widoki między bazami danych będą działać poprawnie.https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql/enabling-cross-database-access-in-sql-server
uważaj na ryzyko
źródło