Horário de verão 2018

Já tivemos duas mudanças no horário de verão do Brasil neste ano de 2018.

Primeiro o horário de verão iria começar no dia 21 de Outubro.

Por solicitação do TSE (Tribunal Superior Eleitoral) tivemos o início do horário de verão adiado para 04 de Novembro para as eleições não serem impactadas (Dezembro 2017), confira aqui.

Depois por solicitação do MEC (Ministério da Educação) tivemos o início do horário de verão adiado para o dia 18 de Novembro para o ENEM não ser impactado (04 de Outubro de 2018), confira aqui.

Até o presente momento não houve nenhum decreto oficial do governo brasileiro confirmando a data de início do horário de verão para o dia 18 de Novembro, portanto ainda não há uma atualização (KB) da Microsoft que troque o início do horário de verão para 18 de Novembro. Existe apenas desde Julho de 2018 a atualização que realiza a alteração do início do horário de verão para 04 de Novembro (KB4093753). Por enquanto temos que certificar que temos esta atualização que irá mudar o início do horário de verão para 04 de Novembro instalada para não termos o horário alterado já no próximo final de semana (21 de Outubro). Agora é esperar os próximos passos do governo brasileiro e também da Microsoft para sabermos se existirá uma nova atualização que realizará a alteração do início do horário de verão para 18 de Novembro. Assim que houver alguma novidade deste assunto postarei aqui para vocês. Vale a pena conferir também o post no blog da Technet escrito no dia 10 de Outubro sobre este assunto clicando aqui.

Links úteis:

Atualização 1 (16/10/2018):

O governo federal voltou atrás na sua decisão de alterar o início do horário de verão para o dia 18 de Novembro e irá manter o início para o dia 04 de Novembro, conforme já previsto anteriormente, confira aqui a notícia.

Conferir a utilização de recursos específicos da edição Enterprise do SQL Server

Para conferirmos a utilização de recursos específicos da edição Enterprise do SQL server é muito simples.

Podemos utilizar a DMV sys.dm_db_persisted_sku_features para listar os recursos que são específicos de acordo com a edição do SQL Server. Uma database que utiliza um destes recursos não pode ser movida para uma edição que não os suporte.

select *
from sys.dm_db_persisted_sku_features

Nas imagens abaixo temos 3 exemplos de recursos de edições específicas do SQL Server: Compression, ColumnStoreIndex e Partitioning.

É isso galera. Simples, rápido e fácil. Espero que tenham gostado.

Resolvendo o alerta Network Binding Order da instalação do SQL Server no Windows Server 2016

Precisando ajustar a ordem de prioridade das interfaces de rede no Windows Server 2016 para remover o alerta da instalação do SQL Server e não encontrou a antiga interface gráfica para realizar este ajuste?

Está no lugar certo.

Screen Shot 2017-08-24 at 02.14.03

Com a ajuda dos comandos abaixo capture o GUID da sua interface de rede que você quer colocar como preferencial.


ipconfig /all

Screen Shot 2017-08-24 at 02.21.30


wmic nicconfig get description, SettingID

Screen Shot 2017-08-24 at 02.22.01

Agora para editar a ordem das interfaces você deve navegar até a chave abaixo do registro do Windows com a ferramenta regedit:


HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Tcpip\Linkage\

Agora edite o valor Bind do tipo REG_MULTI_SZ desta chave deixando a interface prioritária em cima, conforme exemplo abaixo:

Screen Shot 2017-08-24 at 02.28.14

Agora execute novamente a instalação do SQL Server e esta pendência terá sido resolvida.

Screen Shot 2017-08-24 at 02.30.12

É isso galera. Espero que tenham gostado!

O que é uma Table variable?

O que é uma table variable (variável do tipo table) no SQL Server?

É uma variável como qualquer outra com um tipo de dados especial (table) que pode ser usado para armazenar um result set qualquer.

Como criar/declarar uma table variable?


DECLARE @produto TABLE
(
id int,
valor money
)

Como consultar uma table variable?

SELECT id, valor FROM @produto;

Quando usar?

Utilize variáveis do tipo TABLE apenas para armazenar poucos registros (Até 100 registros de preferência).

Curiosidades

  • Não possuem estatísticas;
  • Não podem ser alteradas depois de criadas;
  • Não são afetadas por ROLLBACK, pois elas não suportam transações;
  • Não existe garantia que estarão residentes apenas em memória. Sob pressão de memória as páginas pertencentes a uma variável do tipo TABLE podem ser transferidas para a database tempdb;
  • Em consultas que façam junções em uma table variable considere utilizar o hintRECOMPILE para fazer com que o otimizador use a cardinalidade correta para ela.

Referências:

https://docs.microsoft.com/en-us/sql/t-sql/language-elements/declare-local-variable-transact-sql

https://docs.microsoft.com/en-us/sql/t-sql/data-types/table-transact-sql

Como transferir logins e senhas entre instâncias do SQL Server

Simples.

Basta criar as stored procedures sp_hexadecimal e sp_help_revlogin na database master do servidor de origem com a ajuda do código abaixo:

USE master
GO
IF OBJECT_ID ('sp_hexadecimal') IS NOT NULL
DROP PROCEDURE sp_hexadecimal
GO
CREATE PROCEDURE sp_hexadecimal
@binvalue varbinary(256),
@hexvalue varchar (514) OUTPUT
AS
DECLARE @charvalue varchar (514)
DECLARE @i int
DECLARE @length int
DECLARE @hexstring char(16)
SELECT @charvalue = '0x'
SELECT @i = 1
SELECT @length = DATALENGTH (@binvalue)
SELECT @hexstring = '0123456789ABCDEF'
WHILE (@i <= @length)
BEGIN
DECLARE @tempint int
DECLARE @firstint int
DECLARE @secondint int
SELECT @tempint = CONVERT(int, SUBSTRING(@binvalue,@i,1))
SELECT @firstint = FLOOR(@tempint/16)
SELECT @secondint = @tempint - (@firstint*16)
SELECT @charvalue = @charvalue +
SUBSTRING(@hexstring, @firstint+1, 1) +
SUBSTRING(@hexstring, @secondint+1, 1)
SELECT @i = @i + 1
END</pre>
SELECT @hexvalue = @charvalue GO IF OBJECT_ID ('sp_help_revlogin') IS NOT NULL DROP PROCEDURE sp_help_revlogin GO CREATE PROCEDURE sp_help_revlogin @login_name sysname = NULL AS DECLARE @name sysname DECLARE @type varchar (1) DECLARE @hasaccess int DECLARE @denylogin int DECLARE @is_disabled int DECLARE @PWD_varbinary varbinary (256) DECLARE @PWD_string varchar (514) DECLARE @SID_varbinary varbinary (85) DECLARE @SID_string varchar (514) DECLARE @tmpstr varchar (1024) DECLARE @is_policy_checked varchar (3) DECLARE @is_expiration_checked varchar (3) DECLARE @defaultdb sysname IF (@login_name IS NULL) DECLARE login_curs CURSOR FOR SELECT p.sid, p.name, p.type, p.is_disabled, p.default_database_name, l.hasaccess, l.denylogin FROM sys.server_principals p LEFT JOIN sys.syslogins l ON ( l.name = p.name ) WHERE p.type IN ( 'S', 'G', 'U' ) AND p.name 'sa' ELSE DECLARE login_curs CURSOR FOR SELECT p.sid, p.name, p.type, p.is_disabled, p.default_database_name, l.hasaccess, l.denylogin FROM sys.server_principals p LEFT JOIN sys.syslogins l ON ( l.name = p.name ) WHERE p.type IN ( 'S', 'G', 'U' ) AND p.name = @login_name OPEN login_curs FETCH NEXT FROM login_curs INTO @SID_varbinary, @name, @type, @is_disabled, @defaultdb, @hasaccess, @denylogin IF (@@fetch_status = -1) BEGIN PRINT 'No login(s) found.' CLOSE login_curs DEALLOCATE login_curs RETURN -1 END SET @tmpstr = '/* sp_help_revlogin script ' PRINT @tmpstr SET @tmpstr = '** Generated ' + CONVERT (varchar, GETDATE()) + ' on ' + @@SERVERNAME + ' */' PRINT @tmpstr PRINT '' WHILE (@@fetch_status -1) BEGIN IF (@@fetch_status -2) BEGIN PRINT '' SET @tmpstr = '-- Login: ' + @name PRINT @tmpstr IF (@type IN ( 'G', 'U')) BEGIN -- NT authenticated account/group SET @tmpstr = 'CREATE LOGIN ' + QUOTENAME( @name ) + ' FROM WINDOWS WITH DEFAULT_DATABASE = [' + @defaultdb + ']' END ELSE BEGIN -- SQL Server authentication -- obtain password and sid SET @PWD_varbinary = CAST( LOGINPROPERTY( @name, 'PasswordHash' ) AS varbinary (256) ) EXEC sp_hexadecimal @PWD_varbinary, @PWD_string OUT EXEC sp_hexadecimal @SID_varbinary,@SID_string OUT -- obtain password policy state SELECT @is_policy_checked = CASE is_policy_checked WHEN 1 THEN 'ON' WHEN 0 THEN 'OFF' ELSE NULL END FROM sys.sql_logins WHERE name = @name SELECT @is_expiration_checked = CASE is_expiration_checked WHEN 1 THEN 'ON' WHEN 0 THEN 'OFF' ELSE NULL END FROM sys.sql_logins WHERE name = @name SET @tmpstr = 'CREATE LOGIN ' + QUOTENAME( @name ) + ' WITH PASSWORD = ' + @PWD_string + ' HASHED, SID = ' + @SID_string + ', DEFAULT_DATABASE = [' + @defaultdb + ']' IF ( @is_policy_checked IS NOT NULL ) BEGIN SET @tmpstr = @tmpstr + ', CHECK_POLICY = ' + @is_policy_checked END IF ( @is_expiration_checked IS NOT NULL ) BEGIN SET @tmpstr = @tmpstr + ', CHECK_EXPIRATION = ' + @is_expiration_checked END END IF (@denylogin = 1) BEGIN -- login is denied access SET @tmpstr = @tmpstr + '; DENY CONNECT SQL TO ' + QUOTENAME( @name ) END ELSE IF (@hasaccess = 0) BEGIN -- login exists but does not have access SET @tmpstr = @tmpstr + '; REVOKE CONNECT SQL TO ' + QUOTENAME( @name ) END IF (@is_disabled = 1) BEGIN -- login is disabled SET @tmpstr = @tmpstr + '; ALTER LOGIN ' + QUOTENAME( @name ) + ' DISABLE' END PRINT @tmpstr END FETCH NEXT FROM login_curs INTO @SID_varbinary, @name, @type, @is_disabled, @defaultdb, @hasaccess, @denylogin END CLOSE login_curs DEALLOCATE login_curs RETURN 0 GO
<pre>

Importante: Sempre consulte o código mais atualizado destas procedures e leia todas as observações e detalhes direto no KB original da Microsoft: https://support.microsoft.com/en-us/help/918992/how-to-transfer-logins-and-passwords-between-instances-of-sql-server

Agora no servidor de origem conectado na database master execute o comando abaixo:


EXEC sp_help_revlogin

Pronto. O resultado deste comando será o script pronto de todos os logins e senhas da sua instância de SQL Server mantendo os SIDs e senhas originais.

Agora no servidor de destino apenas execute o script gerado com a ajuda da procedure sp_help_revlogin.

Por hoje é isso pessoal. Espero que tenham gostado.

Como estimar o tempo de backup e restore no SQL Server

Já passou mais de 1 hora, seu BACKUP ou RESTORE ainda não finalizou e você está querendo uma estimativa do tempo de conclusão?

Fácil.

Basta executar o comando abaixo na sua instância de SQL Server utilizando a DMV (Dynamic Management View) dm_exec_requests para retornar as colunas percent_complete e estimated_completion_time e a DMF (Dynamic Management Function) dm_exec_sql_text para retornar o comando/TSQL de BACKUP/RESTORE executado.

SELECT
session_id as SPID,
command, s.text AS Query,
start_time,
percent_complete,
dateadd(second,estimated_completion_time/1000, getdate()) as estimated_completion_time
FROM sys.dm_exec_requests r
CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) s
WHERE r.command in ('BACKUP DATABASE','RESTORE DATABASE')
GO

Retorno:

Screen Shot 2017-08-24 at 03.08.44

Pronto! Até a próxima.

Descobrindo se os seus planos de execução estão sendo reutilizados no SQL Server

Quer saber se os seus planos de execução que estão em cache no SQL Server estão sendo reutilizados?

Para visualizar a quantidade e porcentagem de planos de execução que estão sendo reutilizados basta executar a consulta abaixo:


DECLARE @singleExec BIGINT;
DECLARE @multipleExec BIGINT;
DECLARE @totalExec BIGINT;

SELECT @singleExec = COUNT(*)
FROM sys.dm_exec_query_stats s
WHERE execution_count = 1
SELECT @totalExec = COUNT(*)
FROM sys.dm_exec_query_stats s

SET @multipleExec = @totalExec - @singleExec

SELECT @totalExec AS totalExec, @multipleExec AS multipleExec, @singleExec AS singleExec
UNION ALL
SELECT 100 AS totalExec, ((@multipleExec * 100) / @totalExec) AS multipleExec, ((@singleExec * 100) / @totalExec) AS singleExec

Resultado:

Screen Shot 2017-08-24 at 03.21.28

Primeira linha: #

Segunda linha: %

totalExec: Total de planos de execução em cache.

multipleExec: Total de planos de execução em cache que foram reutilizados.

singleExec: Total de planos de execução em cache que foram utilizados apenas uma única vez.

Se este script foi útil para você avalie na galeria de scripts da TechNet por gentileza: https://gallery.technet.microsoft.com/SQL-Server-Get-Plan-Reuse-412de376

Obrigado! Espero que tenham gostado. Até a próxima!