Utwórz rolę bazy danych, aby umożliwić dostęp do odczytu do wszystkich tabel; dostęp do zapisu do niektórych

9

Mamy bazę danych z ponad 1000 tabel. Muszę utworzyć rolę, która pozwala tylko na odczyt na wszystkich tabelach, a także dostęp do zapisu na dwóch określonych tabelach.

Bałam się rolami bazy danych, ale ilekroć szedłem, aby dodać tabele, musiałem ręcznie wybrać wszystkie 1000 ... czy jest na to lepszy sposób?

Wes
źródło
To może być najprostszy sposób ... Czy istnieje sposób na napisanie skryptu? Muszę zachować zestaw skryptów, ponieważ za każdym razem, gdy odświeżamy jedną z tych baz danych, mogę natychmiast przywrócić wszystkie ustawienia.
Wes

Odpowiedzi:

9

Przyznanie uprawnień do schematu (np. dbo) Będzie kaskadowe dla wszystkich obiektów w tym schemacie. W przypadku indywidualnych wyjątków możesz po prostu wymienić je wyraźnie:

GRANT SELECT ON SCHEMA::dbo TO [role];
GO

GRANT INSERT, UPDATE --, DELETE
  ON dbo.table_they_can_write_to TO [role];

DENY SELECT ON dbo.table_they_cannot_read TO [role];
Aaron Bertrand
źródło
3
Wystarczająco łatwe. Cieszę się, że mamy taką społeczność.
Wes
1

Spróbuj tego :

EXEC sp_MSForEachTable 'GRANT INSERT, UPDATE ON ? to [ROLE]'
druzin
źródło
3
FYI daje to zapis, ale brak dostępu do odczytu do wszystkich tabel, a także całkowicie ignoruje schemat. sp_MSForEachTableJest także nieudokumentowany, nieobsługiwany i prawdopodobnie ma takie same problemy z pomijaniem jaksp_MSForEachDB .
Aaron Bertrand