Estou construindo um aplicativo que precisa ter a opção de configurar (desativar/ativar) o controle de alterações em tabelas em um banco de dados específico. Estou me conectando ao banco de dados via usuário SQL. Quais permissões de banco de dados precisam ser adicionadas para o usuário SQL para desativar/ativar o rastreamento de alterações nas tabelas e a opção de executar a consulta abaixo:
SELECT DISTINCT
sct1.name AS CT_schema
, sot1.name AS CT_table
, ps1.row_count AS CT_rows
, sct2.name AS tracked_schema
, sot2.name AS tracked_name
, CHANGE_TRACKING_MIN_VALID_VERSION(sot2.object_id) AS min_valid_version
, itt.create_date AS change_tracking_table_creation_date
, CAST(ps1.reserved_page_count * 8. / 1024 AS BIGINT) AS CT_reserved_MB
, CAST(ps2.reserved_page_count * 8. / 1024 AS BIGINT) AS tracked_base_table_MB
, ps2.row_count AS tracked_rows
FROM sys.internal_tables it
JOIN sys.objects sot1
ON it.object_id = sot1.object_id
JOIN sys.schemas AS sct1
ON sot1.schema_id = sct1.schema_id
JOIN sys.dm_db_partition_stats ps1
ON it.object_id = ps1.object_id
AND ps1.index_id IN (0, 1)
LEFT JOIN sys.objects sot2
ON it.parent_object_id = sot2.object_id
LEFT JOIN sys.schemas AS sct2
ON sot2.schema_id = sct2.schema_id
LEFT JOIN sys.dm_db_partition_stats ps2
ON sot2.object_id = ps2.object_id
AND ps2.index_id IN (0, 1)
INNER JOIN sys.internal_tables itt
ON itt.name = sot1.name
WHERE it.internal_type IN (209, 210);
A melhor abordagem é uma combinação de tentar e ler a documentação.
Estou assumindo que o Change Tracking (CT) já está ativado no nível do banco de dados.
Vamos criar um novo login e usuário nesse banco de dados (estou usando o StackOverflow)
Em seguida, você pode representar o Login e executar sua consulta.
Dando um erro:
(Isso se aplica ao SQL 2019 e anteriores. As permissões para SQL 2022 são
VIEW DATABASE PERFORMANCE STATE
)Se você conceder essa permissão (de uma sessão diferente que não está representando), poderá executar sua consulta.
A segunda parte é sobre habilitar o Change Tracking em qualquer tabela. Você não forneceu um código para isso, mas a sintaxe é simples
Desta vez, o erro não é tão útil
Temos que olhar a documentação para a instrução Alter Table
Podemos conceder permissão granular em tabelas, mas como você deseja habilitar CT em qualquer tabela (possivelmente até em tabelas futuras), temos que ser menos granulares.
A permissão de nível de banco de dados mais próxima que pude encontrar é
que funciona, mas dá ao usuário permissão para
ALTER
quaisquer objetos (procedimentos, funções, etc.)Portanto, eu recomendaria um SQL dinâmico envolvido em um procedimento armazenado com um nome de tabela como parâmetro.
Como fazer isso corretamente e sem injeções SQL está fora do escopo desta questão, então gostaria de apontar para Permissões de empacotamento em procedimentos armazenados por Erland Sommarskog