Muszę ograniczyć dostęp do konkretnego użytkownika, ale nadal muszą widzieć dane w tabelach należących do dbo.
Próbuję wykonać następujące czynności:
- Schemat dbo działa tak, jak normalnie, ma dostęp do wszystkiego
- Schemat Schemat ma dostęp tylko do obiektów schematu 1
- jeśli widok schematu1 lub procedura składowana uzyskuje dostęp do danych w tabelach należących do dbo, łańcuch uprawnień odpowiednio
- użytkownik1 ma dostęp do schematu1 i nic więcej; z wyjątkiem przypadku # 3
Oto, co próbowałem:
- Utwórz użytkownika user1 zamapowanego na testowy login z losowym hasłem
- Utworzono kilka tabel w schemacie dbo z niektórymi danymi testowymi
- Utworzono schemat schematu 1
- Utworzono schema1.get_profiles, który wybiera z widoku o nazwie schema1.profiles, który uzyskuje dostęp do danych w dbo.people, dbo.taglinks i dbo.tags
Jednak przy użyciu następującej instrukcji podczas logowania jako użytkownik1:
EXEC get_profiles 1
prowadzi do:
The SELECT permission was denied on the object 'tags', database 'schema_test', schema 'dbo'.
Próbowałem WITH EXECUTE AS OWNER
i nie mogę zrozumieć, jak powinno działać „łańcuchowanie własności”.
Próbowałem też
GRANT EXECUTE ON SCHEMA::schema1 TO user1
GRANT INSERT ON SCHEMA::schema1 TO user1
GRANT SELECT ON SCHEMA::schema1 TO user1
GRANT UPDATE ON SCHEMA::schema1 TO user1
GRANT VIEW DEFINITION ON SCHEMA::schema1 TO user1
ale pojawia się następujący błąd (pomimo tego, że jestem użytkownikiem z dostępem na poziomie dbo):
Cannot grant, deny, or revoke permissions to sa, dbo, entity owner, information_schema, sys, or yourself.
To, czego potrzebuję, to użytkownik1, aby móc uzyskać dostęp do danych za pośrednictwem procedur składowanych, które im daję, i nic więcej.
Ponadto ma to ostatecznie za zadanie istnieć w istniejącej bazie danych SQL Azure, ale najpierw testuję lokalną bazę danych.
sql-server
sql-server-2008
stored-procedures
Julia McGuigan
źródło
źródło
Odpowiedzi:
Podstawową koncepcją jest użycie uprawnień schematu GRANT / DENY . Możesz skutecznie zarządzać uprawnieniami, tworząc rolę, a następnie dodając do niej członków.
Poniżej znajduje się przykład, który szczegółowo Cię wyjaśni
Teraz przetestuj:
Teraz utwórz Procedury przechowywane:
Teraz udziel uprawnienia użytkownikowi A w SP schemaB
Przetestuj to .., aby sprawdzić, czy UserA jest w stanie uruchomić SP ze schematuB. To przejdzie
Ale Użytkownik nie będzie mógł zobaczyć danych ze SchemaB
Alternatywnie możesz użyć DATABASE ROLE i po prostu dodać do niej użytkowników, aby lepiej zarządzać uprawnieniami:
Poniższe stwierdzenie upewni się, że UserA będzie w stanie zobaczyć schemat A, a NIE schemat. Dobrą rzeczą jest to, że możesz po prostu dodać użytkowników do
SchemaBUsesSchemaAProc
roli, a oni odziedziczą wszystkie uprawnienia nadane tej roli.Jeśli chcesz zezwolić UserA na wykonywanie SP, które są własnością SchemaB, poniższe polecenie wykona zadanie:
W ten sposób UserA nie widzi tabel SchemaB, ale nadal może wykonywać procy z SchemaB.
Poniżej wyjaśni hierarchię uprawnień :
źródło