Eu recebo um erro quando executo esta consulta:
SELECT
dependencies.referencing_id as object_id,
dependencies.referencing_minor_id as column_id,
dependencies.referenced_id AS referenced_object_id,
RTRIM(referenced_objects.type) AS referenced_type
FROM
sys.sql_expression_dependencies AS dependencies
JOIN sys.objects AS referenced_objects WITH(NOLOCK) ON referenced_objects.object_id = dependencies.referenced_id
WHERE dependencies.referencing_id != dependencies.referenced_id
Erro :
A permissão SELECT foi negada no objeto 'sql_expression_dependencies', banco de dados 'mssqlsystemresource', esquema 'sys'.
O Login tem associação apenas na função de servidor PUBLIC e concedeu VIEW ANY DATABASE e VIEW ANY DEFINITION. Adicionei um usuário com associação na função de banco de dados PUBLIC para o banco de dados que estou comparando. Presumi que a permissão no nível do servidor seria suficiente, mas estava errado. Fiz isso em um banco de dados 2008R2, além de um banco de dados 2014.
No banco de dados de 2014, também concedi permissão de nível de servidor SELECT ALL USER SECURABLES. O erro persistiu.
Eu concedi o SELECT do usuário no banco de dados. O erro persistiu.
Eu removi a permissão SELECT e adicionei o usuário à função de banco de dados data_reader. A consulta foi resolvida, mas nenhum dado foi retornado (executar a mesma consulta como um administrador de sistema retorna mais de 130 linhas). Agora estou completamente perplexo.
Eu concedi SELECT ao usuário em sys.sql_expression_dependencies explicitamente com os mesmos resultados acima.
Depois de pesquisar essas permissões, o consenso parece ser que conceder SELECT a um usuário em um banco de dados é o mesmo que adicionar o usuário à função data_reader. Mas este obviamente não é o caso. Quero criar um Login/Usuário com o menor conjunto de privilégios possível para realizar a comparação.
Como faço para conceder acesso à exibição sys.sql_expression_dependencies em mssqlsystemresource sem conceder acesso data_reader em todo o banco de dados? Existe uma maneira de conceder SELECT apenas em mssqlsystemresource?
** Observação - li algumas outras postagens no SE sobre mssqlsystemresource, mas elas não se referem a isso:
- Não tenho NEGAÇÃO de nada atribuído a este Login/Usuário
- A participação na função PUBLIC (servidor ou banco de dados) não tem influência, pois as permissões são idênticas às de um servidor "conhecido em bom estado".
- Prefiro que o usuário não tenha permissões SELECT gerais em todo o banco de dados.