para isolar tabelas internas do acesso a bancos de dados de terceiros, criamos esquemas especificamente para esse caso de uso. Logins/usuários de banco de dados de terceiros só têm acesso a esses esquemas "públicos".
O problema é que o usuário tinha mais permissões do que deveria e muitas consultas de terceiros acessam as tabelas internas.
Como não posso remover as permissões abruptamente, gostaria de fazer isso aos poucos. Identificar consultas problemáticas e alterá-las de acordo.
Para isso tentei utilizar os recursos de Auditoria de Banco de Dados do Sql Server, mas parece que estou faltando informações para o que preciso:
Digamos que tenho a tabela [Internal].[Machine]
e a View [Public].[Machine]
que para simplificar é apenas select * from [Internal].[Machine]
. O usuário viewer
só tem permissão para selecionar [Public].[Machine]
.
Adicionar uma "especificação de auditoria de banco de dados" para (Type=SELECT, ObjectClass=SCHEMA, ObjectName=Internal, PrincipalName=viewer) produz uma entrada para select * from [Internal].[Machine]
e select * from [Public].[Machine]
.
Meu objetivo é ter apenas uma entrada para select * from [Internal].[Machine]
, ou seja, quando o objeto for acessado diretamente pela instrução de consulta. E até onde vi, as linhas produzidas não contêm as informações necessárias para diferenciar as duas.
Isso é de alguma forma possível com o recurso Auditoria/Eventos Estendidos do Sql Server (ou algo completamente diferente)?
Quando você está especificando um objeto para auditoria em um esquema específico, ele deve ter um nome de duas partes; no seu caso, se você quiser fazer uma auditoria,
[Internal].[machine]
a especificação de auditoria do banco de dados seria como abaixo,Se você deseja auditar ambos os objetos, neste caso, tanto para tabela quanto para visualização, seria como abaixo,
Resultado dos testes:
Com exemplo de UI.