Ativei uma auditoria em uma instância do SQL Server 2016.
Versão i SP1 CU3, Enterprise Edition.
Com esta consulta:
SELECT * FROM sys.server_file_audits
Eu recebo como log_file_path : O:\auditfiles\
In log_file_name : logins_3D6DA4C0-B388-4175-88A5-D2820733CFB7.sqlaudit
Mas quando eu consulto:
SELECT * FROM sys.fn_get_audit_file ('O:\auditfiles\logins_3D6DA4C0-B388-4175-88A5-D2820733CFB7.sqlaudit',default,default);
Não retorna nada.
Verificando no sistema de arquivos o nome real do arquivo é:
logins_3D6DA4C0-B388-4175-88A5-D2820733CFB7_0_131451051332700000.sqlaudit
Onde a parte do nome do arquivo _0_131451051332700000 não é recuperada da consulta no esquema sys.
Quando seleciono com o nome de arquivo correto, recebo os resultados.
Eu preciso automatizar isso para coletar dados de consultas externas.
Como posso recuperar o nome de arquivo correto?
Revendo a documentação para sys.server_file_audits , o
log_file_name
é (destacando o meu)Dependendo da rapidez com que seus arquivos sqlaudit estão sendo criados, pode ser extremamente difícil determinar qual é o arquivo de auditoria ' atual '.
Se você quiser uma seleção rápida e única de informações de auditoria, você pode usar curingas de '*.sqlaudit' para ler TODOS os arquivos no diretório.
A leitura de arquivos sqlaudit que estão sendo gravados no momento apresenta desafios no fato de que as linhas podem ser gravadas nesse arquivo ativo imediatamente APÓS você ter acabado de lê-lo, portanto, você pode perder futuras linhas de auditoria se não as selecionar continuamente. Além disso, esteja ciente de que os arquivos de auditoria continuarão sendo gravados no caminho do diretório e a seleção de curinga será executada cada vez mais, a menos que você implemente algum tipo de processo de remoção dos arquivos sqlaudit.
Se sua intenção é rastrear e salvar essas informações de auditoria, sugiro implementar uma solução semelhante a uma resposta que dei para ' Como carregar dados em uma tabela do arquivo de auditoria do SQL Server? '
Ele usa um trabalho do Sql Agent que executa um procedimento armazenado para processar os arquivos sqlaudit. Em resumo, o procedimento armazenado: