Crie uma função de banco de dados para permitir acesso de leitura a todas as tabelas; acesso de gravação a alguns

9

Temos um banco de dados com mais de 1000 tabelas. Preciso criar uma função que permita somente leitura em todas as tabelas, bem como acesso de gravação a duas tabelas específicas.

Eu estava mexendo nas funções de banco de dados, mas sempre que adicionava as tabelas, tinha que selecionar manualmente todas as 1000 ... existe uma maneira melhor de fazer isso?

Wes
fonte
Essa realmente pode ser a maneira mais simples ... Existe uma maneira de escrever isso? Preciso manter um conjunto de scripts para que, sempre que atualizarmos um desses bancos de dados, eu possa recuperar todas as configurações instantaneamente.
Wes

Respostas:

9

A concessão de permissões no esquema (por exemplo dbo) fará cascata em todos os objetos nesse esquema. Para exceções individuais, basta listá-las explicitamente:

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
fonte
3
Bastante fácil. Ainda bem que temos uma comunidade como esta.
Wes
1

Tente o seguinte:

EXEC sp_MSForEachTable 'GRANT INSERT, UPDATE ON ? to [ROLE]'
druzin
fonte
3
Para sua informação, isso fornece acesso de gravação, mas não de leitura, a todas as tabelas e também ignora completamente o esquema. Também não sp_MSForEachTableé documentado, não é suportado e possivelmente sofre os mesmos problemas de ignorar quesp_MSForEachDB .
Aaron Bertrand