Versões : SQL Server 2008 R2 - 2014
Estou usando uma auditoria de servidor para localizar alterações nos logons em minhas instâncias do SQL Server e gravá-las no caminho do diretório ERRORLOG. Infelizmente, nem todas as instâncias usam o mesmo caminho para o diretório ERRORLOG. Eu posso pegar o caminho usando SELECT SERVERPROPERTY('ErrorLogFileName')
, mas preciso "inserir" o valor de retorno dessa declaração em dois outros lugares. A primeira é quando estou criando a Auditoria do Servidor:
CREATE SERVER AUDIT [ServerAuditName]
TO FILE
( FILEPATH = N'C:\Program Files\Microsoft SQL Server\MSSQL\Log'
,MAXSIZE = 0 MB
,MAX_ROLLOVER_FILES = 2147483647
,RESERVE_DISK_SPACE = OFF
)
Então, eu preciso "inserir" os resultados da consulta SERVERPROPERTY em uma variável ou... algo, para que eu possa usá-lo no valor FILEPATH acima. Secundariamente, eu também preciso encontrar o caminho do diretório ERRORLOG ao ler os arquivos *.sqlaudit que o Server Audit cria. Posso usar facilmente o seguinte para obter arquivos, mas aqui também preciso "inserir" o valor do caminho do arquivo com o resultado da consulta SERVERPROPERTY:
SELECT *
FROM sys.fn_get_audit_file('Filepath\*.sqlaudit',DEFAULT, DEFAULT)
Eu tentei alguns "google-fu" e olhei para algumas funções de string, como substituir e "trim-family" ... o que não era muito relevante. Se alguém puder me ajudar ou me indicar um bom artigo ou dois sobre como conseguir isso, eu agradeceria muito.
A primeira coisa que você precisa fazer é cortar o nome do arquivo desse caminho completo, senão você receberá apenas um erro. O seguinte faz isso usando um CTE para aplicar a expressão duas vezes para que eu não precise copiar/colar o
CONVERT
:Na consulta acima, usei
COLLATE Latin1_General_100_CI_AS
para forçar uma comparação que não diferencia maiúsculas de minúsculas, pois notei diferenças entre maiúsculas e minúsculas entre o SQL Server "regular" (ou seja, executando por meio de um serviço) e o SQL Server Express LocalDB em termos de saída daSERVERPROPERTY('ErrorLogFileName')
função:"regular":
C:\Arquivos de Programas\Microsoft SQL Server\MSSQL14.SQL2017EXPRESS\MSSQL\Log\ERRORLOG
LocalDB:
C:\Users\Solomon\AppData\Local\Microsoft\Microsoft SQL Server Local DB\Instances\LostInTranslation\error.log
Você pode usar isso com o SQL dinâmico para gerar a
CREATE SERVER AUDIT
instrução da seguinte maneira:Para ler o arquivo de auditoria, você não precisa do SQL dinâmico, pois pode passar a expressão para o DMF da seguinte forma:
Não tenho certeza se entendi completamente sua pergunta. Existe uma razão pela qual você não pode usar dinâmico
SQL
e gerar esses comandos?Na minha instância local, recebo: