Créez un rôle de base de données pour permettre l'accès en lecture à toutes les tables; accès en écriture à certains

9

Nous avons une base de données avec plus de 1000 tables. J'ai besoin de créer un rôle qui autorise la lecture uniquement sur toutes les tables, ainsi que l'accès en écriture à deux tables spécifiques.

Je déconnais avec les rôles de base de données, mais chaque fois que j'allais ajouter les tables, je devais remettre les 1000 au choix ... y a-t-il une meilleure façon de le faire?

Nous s
la source
En fait, c'est peut-être le moyen le plus simple ... Y a-t-il un moyen de l'écrire? Je dois conserver un ensemble de scripts pour chaque fois que nous actualisons l'une de ces bases de données, je peux récupérer tous les paramètres instantanément.
Wes

Réponses:

9

L'octroi d'autorisations sur le schéma (par exemple dbo) se répercutera en cascade sur tous les objets de ce schéma. Pour les exceptions individuelles, vous pouvez simplement les énumérer explicitement:

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
la source
3
Assez facile. Heureux que nous ayons une communauté comme celle-ci.
Wes
1

Essaye ça :

EXEC sp_MSForEachTable 'GRANT INSERT, UPDATE ON ? to [ROLE]'
druzin
la source
3
Pour info, cela donne un accès en écriture mais pas en lecture à toutes les tables, et ignore également le schéma. Il sp_MSForEachTableest également non documenté, non pris en charge et peut éventuellement subir les mêmes problèmes de saut quesp_MSForEachDB .
Aaron Bertrand