Mam taką strukturę tabeli (uproszczonej)
Name, EMail, LastLoggedInAt
Mam użytkownika w programie SQL Server (RemoteUser), który powinien widzieć tylko dane (za pośrednictwem kwerendy Select), w których pole LastLoggdInAt nie ma wartości null.
Wygląda na to, że mogę to zrobić? Czy to możliwe?
Odpowiedzi:
Model zabezpieczeń programu SQL Server umożliwia udzielanie dostępu do widoku bez udzielania dostępu do bazowych tabel.
Ponieważ przykładowy kod to świetny sposób na pokazanie koncepcji, weź pod uwagę następujące kwestie wraz z
LoginDetails
tabelą i odpowiednim widokiem:Utworzymy login i użytkownika, a następnie przypiszemy temu użytkownikowi prawa do wyboru wierszy z widoku, bez żadnych uprawnień do przeglądania samej tabeli.
Teraz wstawimy dwa wiersze testowe:
To testuje model bezpieczeństwa. Pierwsza
SELECT
instrukcja kończy się powodzeniem, ponieważ wybiera z widoku, natomiast drugaSELECT
instrukcja kończy się niepowodzeniem, ponieważ użytkownik nie ma bezpośredniego dostępu do tabeli.Uwaga: wyniki z widoku wykluczają wiersz, w którym
LastLoggedInAt
znajduje się wartośćNULL
, zgodnie z wymaganiami w pytaniu.Druga
SELECT
instrukcja względem tabeli bazowej zwraca błąd:Sprzątać:
Alternatywnie, jeśli masz SQL Server 2016 lub nowszy, możesz użyć predykatu zabezpieczeń na poziomie wiersza, aby uniemożliwić niektórym użytkownikom wyświetlanie wierszy o
LastLoggedInAt
wartości NULL .Najpierw tworzymy tabelę, login, użytkownika dla tego loginu i udzielamy dostępu do tabeli:
Następnie wstawiamy kilka przykładowych wierszy. Jeden wiersz z wartością null
LastLoggedInAt
i jeden z wartością inną niż null dla tej kolumny.W tym miejscu tworzymy funkcję tabelaryczną powiązaną ze schematem, która zwraca wiersz z 0 lub 1 w zależności od wartości
@LastLoggedInAt
i@username
zmiennych przekazywanych do funkcji. Ta funkcja będzie używana przez predykat filtra, aby wyeliminować wiersze, które chcemy ukryć przed niektórymi użytkownikami.To jest filtr bezpieczeństwa, który eliminuje wiersze z
SELECT
instrukcji uruchamianych względemdbo.LoginDetails
tabeli:Powyższy filtr używa tej
dbo.fn_LoginDetailsRemoteUserPredicate
funkcji, przekazując nazwę bieżącego użytkownika wraz z wartościami z każdego wiersza dlaLastLoggedInAt
kolumny zdbo.LoginDetails
tabeli.Jeśli zapytamy tabelę jako zwykły użytkownik:
widzimy wszystkie rzędy:
Jeśli jednak przetestujemy jako
RemoteUser
:widzimy tylko „prawidłowe” wiersze:
I sprzątamy:
Należy pamiętać, że powiązanie schematu w ten sposób z tabelą uniemożliwia modyfikację definicji tabeli bez uprzedniego upuszczenia predykatu filtru i
dbo.fn_LoginDetailsRemoteUserPredicate
funkcji.źródło
LastLoggedInAt
kolumnie.