Hey guys!
Nesse post de hoje vou dar uma dica bem rápida, que é como identificar os parâmetros de inicialização da instância utilizando T-SQL, cenário bem útil quando você tem acesso à conecta na instância, mas não tem acesso ao sistema operacional do servidor.
Utilizando o SQL Server Configurando Manager
Para quem não sabe, o serviço do SQL Server possui alguns parâmetros de inicialização, que permitem alterar o comportamento do SQL Server. Alguns deles já são definidos por padrão, como o -d (caminho dos dados da master), -l (caminho do log da master) e -e (caminho padrão do errorlog).
Quando você tem acesso ao sistema operacional do servidor, você normalmente abre o SQL Server Configuration Manager, seleciona a instância que deseja visualizar os parâmetros e seleciona a opção “Propriedades” ao clicar com o botão direito do mouse, conforme a imagem abaixo:
Utilizando a sys.dm_server_registry do SQL Server 2008 R2 SP1
Mas e quando esse acesso não é possível? Nesse caso, uma alternativa bem prática é acessando o registro do Windows pelo SQL Server. O SQL Server armazena essas informações de inicialização na chave de registro “HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL14.SQL2017\MSSQLServer\Parameters”, onde MSSQL14.SQL2017 = MSSQL
Para facilitar a recuperação dessas informações, podemos utilizar DMV dm_server_registry, disponível a partir do SQL Server 2008 R2 SP1, filtrando pela registry_key:
1 2 3 |
SELECT * FROM sys.dm_server_registry WHERE registry_key LIKE '%Parameters' |
Result:
Utilizando XP de acesso ao registro xp_instance_regread
Entretanto, quem trabalha com vários clientes e várias versões do SQL Server, pode ter a vontade de padronizar um script único para as versões anteriores ao SQL Server 2008 R2 SP1, onde a DMV sys.dm_server_registry ainda não estava disponível.
Se você está nesse cenário ou mesmo o seu SQL Server é anterior ao 2008 R2 SP1, você pode utilizar as Extended Procedures (XP’s) de acesso ao registro (xp_instance_regread e xp_regread) para retornar o valor de um parâmetro individual ou criar um loop para fazer isso:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
DECLARE @Contador INT = 0, @Total INT = 10, @Chave VARCHAR(10) DECLARE @SQLArgs TABLE ( [Value] VARCHAR(50), [Data] VARCHAR(500), ArgNum AS CONVERT(INTEGER, REPLACE([Value], 'SQLArg', '')) ) WHILE(@Contador <= @Total) BEGIN SET @Chave = 'SQLArg' + CAST(@Contador AS VARCHAR(2)) INSERT INTO @SQLArgs EXEC sys.xp_instance_regread 'HKEY_LOCAL_MACHINE', 'Software\Microsoft\MSSQLSERVER\MSSQLServer\Parameters', @Chave SET @Contador += 1 END SELECT * FROM @SQLArgs |
Result:
Utilizando XP de acesso ao registro xp_regread
Você também pode utilizar a xp_regread, mas você terá que informar o nome lógico da instância (no caso do exemplo, MSSQL10_50.SQL2008), enquanto a xp_instance_regread já retorna o nome lógico da instância em que a sua sessão está conectada:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
DECLARE @Contador INT = 0, @Total INT = 10, @Chave VARCHAR(10) DECLARE @SQLArgs TABLE ( [Value] VARCHAR(50), [Data] VARCHAR(500), ArgNum AS CONVERT(INTEGER, REPLACE([Value], 'SQLArg', '')) ) WHILE(@Contador <= @Total) BEGIN SET @Chave = 'SQLArg' + CAST(@Contador AS VARCHAR(2)) INSERT INTO @SQLArgs EXEC sys.xp_regread 'HKEY_LOCAL_MACHINE', 'SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL10_50.SQL2008\MSSQLServer\Parameters', @Chave SET @Contador += 1 END SELECT * FROM @SQLArgs |
Result:
Utilizando XP de acesso ao registro xp_instance_regenumvalues
Analisando o código das 2 soluções utilizando XP’s acima, podemos notar que elas tem um grande problema: Uso de WHILE sem um tamanho correto definido. Se tiver menos de 11 parâmetros, o WHILE estará executando mais vezes que o necessário. Se tiver mais, ele vai deixar de listar alguns parâmetros. Para resolver isso, podemos utilizar a Extended Procedure não documentada, xp_instance_regenumvalues, para nos ajudar nessa necessidade:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
DECLARE @ChaveMestre VARCHAR(50) = 'HKEY_LOCAL_MACHINE', @Registro VARCHAR(100) = 'Software\Microsoft\MSSQLSERVER\MSSQLServer\Parameters' DECLARE @SQLArgs TABLE ( [Value] VARCHAR(50), [Data] VARCHAR(500), ArgNum AS CONVERT(INTEGER, REPLACE([Value], 'SQLArg', '')) ) INSERT INTO @SQLArgs EXECUTE master.sys.xp_instance_regenumvalues @ChaveMestre, @Registro SELECT * FROM @SQLArgs |
Result:
Bom pessoal, espero que tenham gostado dessa dica. Para quem não conhecia a DMV sys.dm_server_registry ou essas Extended Procedures que demonstrei nesse artigo, agora você já conhece.
Um grande abraço e até o próximo post.