Short Scripts – Outubro 2016


Muito bom dia!!

Olá comunidade, estou retornando com um pouco de atraso, mas não se esquecendo das responsabilidades, caso você não tenha entendido estou me referindo ao atraso em publicar mais um post dedicado a sessão Short Scripts que deveria ter ocorrido no mês de setembro.

No decorrer de 2016 fui realizando algumas mudanças nas principais sessões do meu blog e alterando o calendário de publicação o que refletiu na alteração das publicações relacioandas as sessões: Material de Apoio e Short Scripts.

O post de hoje

Falando deste post, vou compartilhar com vocês short scripts dedicados exclusivamente ao novo Microsoft SQL Server, estou me referindo a versão 2016 lançada em Junho deste ano.

Dentre algumas novidades a Microsoft implmentou diversas inovações e melhorias na linguagem Transact-SQL, entre as quais destaco:

  • AT TIME Zone;

  • Data Masking;

  • DMV Sys.dm_exec_function_stats;

  • Função String_Split();

  • Json;

  • Temporal Table;

  • Truncate Table With Partition; e

  • View Sys.Time_Zone_Info.

Short Scripts

A seguir apresento a relação de Short Scripts de hoje:

— Short Script 1 – Utilizando a instrução AT TIME Zone —
SELECT SalesOrderID,
OrderDate,
OrderDate AT TIME ZONE ‘Pacific Standard Time’ AS   OrderDate_TimeZonePST
FROM Sales.SalesOrderHeader
Go

— Short Script 2 – Aplicando mascaramento de dados com DataMasking —
CREATE TABLE DDM_Questions
(myemail VARCHAR(300) MASKED WITH (FUNCTION=’email()’))
GO

INSERT dbo.DDM_Questions (myemail)
VALUES (‘@dog.com’);
GO
SELECT myemail FROM dbo.DDM_Questions;
GO
— Short Script 3 – Utilizando a DMV sys.dm_exec_function_stats —

USE AdventureWorks2016
GO
Select  ProductID,
LocationID,
Shelf,
Bin,
Quantity,
ModifiedDate,
dbo.ufnGetStock(ProductInventory.ProductID)  As ‘Stock’,
dbo.ufnGetProductDealerPrice(ProductInventory.ProductID,
GETDATE()) As ‘Dealer Price’,
dbo.ufnGetProductStandardCost(ProductInventory.ProductID,
GETDATE()-100) As ‘Standard Cost’
From Production.ProductInventory
Go
SELECT Concat(DB_NAME(database_id), ‘.’ ,  OBJECT_SCHEMA_NAME(OBJECT_ID, database_id), ‘.’,  OBJECT_NAME(OBJECT_ID, database_id)) AS Function_Name,
QS.last_execution_time,
QS.max_worker_time,
QS.max_physical_reads,
QS.max_logical_reads,
QS.max_logical_writes,
T.Text
FROM sys.dm_exec_function_stats QS CROSS APPLY
sys.dm_exec_sql_text(sql_handle) T
Where  database_id = DB_ID()
Order by last_execution_time
Go
— Short Script 4 – Realizando spliting de dados com a função String_Split() —
— Exemplo 1 – Separando de forma simples uma string –
SELECT *
FROM STRING_SPLIT(‘Junior,Galvão,MVP,SQL Server’,’,’)
Go
— Exemplo 2 – Fazendo uso de variáveis como parâmetros de entrada de valores –
DECLARE @string VARCHAR(100) = ‘Microsoft,SQL Server,2016,RC0′,
@separador CHAR(1) =’,’
SELECT *
FROM STRING_SPLIT(@string,@separador)
Go
— Exemplo 3 – Armazenando o resultado da divisão de uma string em uma nova tabela –
DECLARE @string VARCHAR(100) = ‘Microsoft,SQL Server,2016,RC0′,
@separador CHAR(1) =’,’
SELECT * INTO #SplitTable
FROM STRING_SPLIT(@string,@separador)
GO

 

— Short Script 5 – Gerando dados no formato Json —
— Exemplo 1 – Utilizando a claúsula JSON Auto —
Select Top 20
AddressID, AddressLine1,
City, PostalCode,
ModifiedDate
from [Person].[Address]
For JSON Auto
Go

— Exemplo 2 – Utilizando a claúsula JSON Path —
Select Top 5
AddressID, AddressLine1,
City, PostalCode,
ModifiedDate
from [Person].[Address]
For JSON Path
Go
— Exemplo 3 – Utilizando a claúsula JSON Path em conjunto com uma variável –
DECLARE @MyJson as NVARCHAR(MAX)
SET @MyJson = (SELECT ‘Pedro’ as Nome, ‘Galvão’ as Sobrenome,
35 as Idade, Getdate() as DataAtual
FOR JSON PATH)
Print (@MyJson)

Go

— Short Script 6 – Criando uma nova Temporal Table —
CREATE TABLE [dbo].[Orders](
[OrdersID] int PRIMARY KEY CLUSTERED,
[Quantity] int NOT NULL,
[UnitPrice] money not null,
[OrderDate] datetime2 NOT NULL,
[SysStartTime] datetime2(0) GENERATED ALWAYS AS ROW START NOT NULL,
[SysEndTime] datetime2(0) GENERATED ALWAYS AS ROW END NOT NULL,
PERIOD FOR SYSTEM_TIME ([SysStartTime],  [SysEndTime]))
WITH (SYSTEM_VERSIONING = ON )
Go

— Short Script 7 – Realizando Truncate Table With Partition —
— Passo 1 – Criando uma nova Partition Function —
CREATE PARTITION FUNCTION [PFRegistro] (int)
AS RANGE RIGHT FOR VALUES
(10000, 30000,
50000, 70000,
90000);
Go

— Passo 2 – Criando um novo Partition Schema —
CREATE PARTITION SCHEME [PSRegistro]
AS PARTITION [PFRegistro]
TO ([PRIMARY], [PRIMARY], [PRIMARY], [PRIMARY], [PRIMARY], [PRIMARY]);— Passo 3 – Criando a tabela TabelaParticionada —
CREATE TABLE dbo.TabelaParticionada
(NumRegistro INT NOT  NULL,
Dados char(1000) NULL,
DataCadastro datetime NOT NULL)
ON [PSRegistro](NumRegistro)
GO— Passo 4 – Populando a Tabela – TabelaParticionada —
INSERT dbo.TabelaParticionada
SELECT TOP 10000
s1.number * 1000  +  s2.number * 100 + s1.number  As NumRegistro,
Replicate(‘SQL Server 2016 ‘,S2.number+1) As  Dados,
GETDATE()+S2.number As DataCadastro
FROM master..spt_values s1 CROSS JOIN master..spt_values s2
WHERE s1.number BETWEEN 0 AND 999 AND s1.type = ‘P’
AND s2.number BETWEEN 0 AND 99 AND s2.type = ‘P’
— Passo 5 – Obtendo a lista de Partitions criadas para TabelaParticionada —
SELECT
$PARTITION.[PFRegistro] (NumRegistro) AS ‘Partition’,
COUNT(*) AS TotalRegistros,
MIN(NumRegistro) AS RegistroInicial,
MAX(NumRegistro) AS RegistroFinal
FROM dbo.TabelaParticionada
GROUP BY $PARTITION.[PFRegistro] (NumRegistro)
Go
— Passo 6 – Realizando a exclusao da particao 1 e tambem da particao 4 ate particao 6 —
TRUNCATE TABLE dbo.TabelaParticionada
WITH (PARTITIONS (2, 4 TO 6));
Go

 

— Short Script 8 – Consultando a relação de TIME Zone —
Select Name,
    Current_UTC_OffSet,
Is_Currently_DST
From Sys.Time_Zone_Info
Go


Bom pessoal, chegamos ao final de mais um Short Scripts, espero que este material possa lhe ajudar e ilustrar algumas das novidades adicionados ao Microsoft SQL Server 2016.

Acredito que você tenha observado que estes códigos já são bastante conhecidos no meu blog, todos estão relacionados aos posts dedicados ao Microsoft SQL Server 2016, publicados no decorrer deste ano.

Links

Caso você queira acessar os últimos posts desta sessão, não perca tempo acesse os links listados abaixo:

Agradecimento

Mais uma vez obrigado por sua visita, um forte abraço, nos encontramos em breve.

Short Script – Dezembro – 2015


Bom dia, Comunidade. Good Morning Everyone!!!!!

Como diria aquele apresentador “O louco meu…..”, 2015 esta chegando ao seu final parece que foi ontem que publiquei o primeiro post deste ano, realmente o tempo esta passando de forma assustadora e não estamos dando conta do quanto estamos vivendo, ou melhor sobrevivendo as loucuras do mundo.

Mantendo a escrita e tradição não poderia deixar passar a oportunidade de compartilhar com vocês os mais novos Short Scripts que adicionei a minha biblioteca de Scripts dedicados ao Microsoft SQL Server desde a versão 2000. Neste momento minha modesta biblioteca de arquivos esta composta por 1.121 scripts organizados em 66 pastas, sub-dividos em 4 categorias:

  • Comuns;
  • Básicos;
  • Intermediários; e
  • Avançados.

Pois bem, no post de hoje destaco os seguintes recursos ou funcionalidades:

  • Arquivo de ErrorLog e Logs Management;
  • Contagem de linhas existentes em tabelas;
  • CTE Recursiva;
  • Diferença entre datas desconsiderando sábado e domingo;
  • Extended Events Target;
  • Função para formatar a primeira letra de cada palavra em maiúscula;
  • Geração de combinação de letras;
  • Multiple Server in Query Windows;
  • Stored Procedure para gerar CNPJ e CPF;
  • SQLCMD Mode; e
  • Variável Table.

Fique a vontade para compartilhar, sugerir melhoras, críticas ou questionamentos sobre estes exemplos.

Segue abaixo a relação de short scripts:

1 – Exemplo – Utilizando Extended Events Target para separar e contar loings e logouts:

CREATE EVENT SESSION [CounterTest] ON SERVER

ADD EVENT sqlserver.login,

ADD EVENT sqlserver.logout(

ACTION(sqlserver.client_hostname,sqlserver.database_name,sqlserver.username))

ADD TARGET package0.event_counter

WITH (MAX_MEMORY=4096 KB,EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=30 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=NONE,TRACK_CAUSALITY=OFF,STARTUP_STATE=OFF)

GO
— login and logout a few times

GO

— query for data

— Query the Target

SELECT

n.value(‘@name[1]’, ‘varchar(50)’) AS Event

, n.value(‘@count[1]’, ‘int’) AS EventCounts

FROM

( SELECT

CAST(t.target_data AS XML) AS target_data

FROM

sys.dm_xe_sessions AS s

JOIN

sys.dm_xe_session_targets AS t

ON

t.event_session_address = s.address

WHERE

s.name = ‘CounterTest’

AND t.target_name = ‘event_counter’

) AS tab

CROSS APPLY target_data.nodes(‘CounterTarget/Packages/Package/Event’) AS q ( n )

GO

 

2 – Exemplo – Stored Procedure para gerar CNPJ e CPF:

CREATE PROCEDURE dbo.stpGerador_CPF_CNPJ (
@Quantidade INT = 1,
@Fl_Tipo BIT = 1
)
AS BEGIN

IF (OBJECT_ID(‘tempdb..#Tabela_Final’) IS NOT NULL) DROP TABLE #Tabela_Final
CREATE TABLE #Tabela_Final (
Nr_Documento VARCHAR(18)
)

DECLARE
@n INT,
@n1 INT,
@n2 INT,
@n3 INT,
@n4 INT,
@n5 INT,
@n6 INT,
@n7 INT,
@n8 INT,
@n9 INT,
@n10 INT,
@n11 INT,
@n12 INT,

@d1 INT,
@d2 INT

— CPF
IF (@Fl_Tipo = 0)
BEGIN

WHILE (@Quantidade > 0)
BEGIN

SET @n = 9
SET @n1 = CAST(( @n + 1 ) * RAND(CAST(NEWID() AS VARBINARY )) AS INT)
SET @n2 = CAST(( @n + 1 ) * RAND(CAST(NEWID() AS VARBINARY )) AS INT)
SET @n3 = CAST(( @n + 1 ) * RAND(CAST(NEWID() AS VARBINARY )) AS INT)
SET @n4 = CAST(( @n + 1 ) * RAND(CAST(NEWID() AS VARBINARY )) AS INT)
SET @n5 = CAST(( @n + 1 ) * RAND(CAST(NEWID() AS VARBINARY )) AS INT)
SET @n6 = CAST(( @n + 1 ) * RAND(CAST(NEWID() AS VARBINARY )) AS INT)
SET @n7 = CAST(( @n + 1 ) * RAND(CAST(NEWID() AS VARBINARY )) AS INT)
SET @n8 = CAST(( @n + 1 ) * RAND(CAST(NEWID() AS VARBINARY )) AS INT)
SET @n9 = CAST(( @n + 1 ) * RAND(CAST(NEWID() AS VARBINARY )) AS INT)
SET @d1 = @n9 * 2 + @n8 * 3 + @n7 * 4 + @n6 * 5 + @n5 * 6 + @n4 * 7 + @n3 * 8 + @n2 * 9 + @n1 * 10
SET @d1 = 11 – ( @d1 % 11 )

IF ( @d1 >= 10 )
SET @d1 = 0

SET @d2 = @d1 * 2 + @n9 * 3 + @n8 * 4 + @n7 * 5 + @n6 * 6 + @n5 * 7 + @n4 * 8 + @n3 * 9 + @n2 * 10 + @n1 * 11
SET @d2 = 11 – ( @d2 % 11 )

IF ( @d2 >= 10 )
SET @d2 = 0

INSERT INTO #Tabela_Final
SELECT CAST(@n1 AS VARCHAR) + CAST(@n2 AS VARCHAR) + CAST(@n3 AS VARCHAR) + ‘.’ + CAST(@n4 AS VARCHAR) + CAST(@n5 AS VARCHAR) + CAST(@n6 AS VARCHAR) + ‘.’ + CAST(@n7 AS VARCHAR) + CAST(@n8 AS VARCHAR) + CAST(@n9 AS VARCHAR) + ‘-‘ + CAST(@d1 AS VARCHAR) + CAST(@d2 AS VARCHAR)

SET @Quantidade = @Quantidade – 1

END

END

— CNPJ
ELSE BEGIN

WHILE (@Quantidade > 0)
BEGIN

SET @n = 9
SET @n1 = CAST(( @n + 1 ) * RAND(CAST(NEWID() AS VARBINARY )) AS INT)
SET @n2 = CAST(( @n + 1 ) * RAND(CAST(NEWID() AS VARBINARY )) AS INT)
SET @n3 = CAST(( @n + 1 ) * RAND(CAST(NEWID() AS VARBINARY )) AS INT)
SET @n4 = CAST(( @n + 1 ) * RAND(CAST(NEWID() AS VARBINARY )) AS INT)
SET @n5 = CAST(( @n + 1 ) * RAND(CAST(NEWID() AS VARBINARY )) AS INT)
SET @n6 = CAST(( @n + 1 ) * RAND(CAST(NEWID() AS VARBINARY )) AS INT)
SET @n7 = CAST(( @n + 1 ) * RAND(CAST(NEWID() AS VARBINARY )) AS INT)
SET @n8 = CAST(( @n + 1 ) * RAND(CAST(NEWID() AS VARBINARY )) AS INT)
SET @n9 = 0
SET @n10 = 0
SET @n11 = 0
SET @n12 = 1

SET @d1 = @n12 * 2 + @n11 * 3 + @n10 * 4 + @n9 * 5 + @n8 * 6 + @n7 * 7 + @n6 * 8 + @n5 * 9 + @n4 * 2 + @n3 * 3 + @n2 * 4 + @n1 * 5
SET @d1 = 11 – ( @d1 % 11 )

IF (@d1 >= 10)
SET @d1 = 0

SET @d2 = @d1 * 2 + @n12 * 3 + @n11 * 4 + @n10 * 5 + @n9 * 6 + @n8 * 7 + @n7 * 8 + @n6 * 9 + @n5 * 2 + @n4 * 3 + @n3 * 4 + @n2 * 5 + @n1 * 6
SET @d2 = 11 – ( @d2 % 11 )

IF (@d2 >= 10)
SET @d2 = 0

INSERT INTO #Tabela_Final
SELECT ” + CAST(@n1 AS VARCHAR) + CAST (@n2 AS VARCHAR) + ‘.’ + CAST (@n3 AS VARCHAR) + CAST (@n4 AS VARCHAR) + CAST (@n5 AS VARCHAR) + ‘.’ + CAST (@n6 AS VARCHAR) + CAST (@n7 AS VARCHAR) + CAST (@n8 AS VARCHAR) + ‘/’ + CAST (@n9 AS VARCHAR) + CAST (@n10 AS VARCHAR) + CAST (@n11 AS VARCHAR) + CAST (@n12 AS VARCHAR) + ‘-‘ + CAST (@d1 AS VARCHAR) + CAST (@d2 AS VARCHAR);

SET @Quantidade = @Quantidade – 1

END

END

SELECT * FROM #Tabela_Final

END

 

3 – Exemplo – Reciclando o arquivo de ErrorLog e Logs Management:

EXEC sp_cycle_errorlog
GO

 

4 – Exemplo – Função – Formatar a primeira letra de cada palavra em maiúscula:

CREATE FUNCTION dbo.udfNomeProprio (
@Nome varchar(250)
)
RETURNS varchar(250)
AS
BEGIN
DECLARE @Pos tinyint = 1
DECLARE @Ret varchar(250) = ”

WHILE (@Pos < LEN(@Nome) + 1)
BEGIN
IF @Pos = 1
BEGIN
–FORMATA 1.LETRA DA “FRASE”
SET @Ret += UPPER(SUBSTRING(@Nome, @Pos, 1))
END
ELSE IF (SUBSTRING(@Nome, (@Pos-1), 1) = ‘ ‘
AND SUBSTRING(@Nome, (@Pos+2), 1) <> ‘ ‘) AND (@Pos+1) <> LEN(@Nome)
BEGIN
–FORMATA 1.LETRA DE “CADA INTERVALO””
SET @Ret += UPPER(SUBSTRING(@Nome, @Pos, 1))
END
ELSE
BEGIN
–FORMATA CADA LETRA RESTANTE
SET @Ret += LOWER(SUBSTRING(@Nome,@Pos, 1))
END

SET @Pos += 1
END

RETURN @Ret
END
GO

SELECT dbo.udfNomeProprio(‘pedro antonio galvão junior’)
GO

 

5 – Exemplo – Utilizando Multiple Server in Query Windows using SQLCMD Mode:

— Sem o GO o SQLCMD Mode não entende o final do bloco —
:connect saom4276
select @@SERVERNAME

:connect SAOM4276\SQLEXPRESS2014
select @@SERVERNAME

— Utilizando o comando Go para encerrar o bloco —
:connect saom4276
select @@SERVERNAME
Go

:connect SAOM4276\SQLEXPRESS2014
select @@SERVERNAME
Go

 

6 – Exemplo – Gerando combinação de letras:

create table #t (string varchar (2))

declare @a1 varchar(1), @a2 varchar(1)
set @a1=’A’

while @a1 <= ‘Z’
begin
set @a2=’A’

while @a2 <= ‘Z’
begin
insert into #t select @a1 + @a2
set @a2 = char (ascii(@a2) + 1)
end

set @a1 = char (ascii(@a1) + 1)
end

select string from #t
where string like ‘_’ /*single underscore*/

Go

 

7 – Exemplo – Calculando diferença entre datas desconsiderando sábado e domingo:

declare @Data datetime set @Data = ‘2015/10/01’

–Calcula a quantidade de dias entre a data inicial e a data atual, excluindo sbados e domingos soma 1 no fim pois no conta o proprio dia

WITH AllDates AS

(   SELECT  TOP (DATEDIFF(DAY, @Data, GETDATE()))

D = DATEADD(DAY, ROW_NUMBER() OVER(ORDER BY a.Object_ID), @Data)

FROM    sys.all_objects a

CROSS JOIN sys.all_objects b

)

SELECT  WeekDays = COUNT(*) +1 –

–Clcula a quantidade de feriados entre as datas

(select count(*) from FTAFE(NOLOCK)

where convert(datetime, convert(varchar, FTAFE.DT_FERIADO), 112) between @Data and GETDATE()

and FTAFE.CD_CIDADE in(0)

and DATEPART(weekday, convert(datetime, convert(varchar, FTAFE.DT_FERIADO), 112)  ) not in(6,7))

FROM    AllDates

WHERE   DATEPART(WEEKDAY, D) NOT IN(6, 7)

Go
8 – Exemplo – Variável Table + CTE Recursiva para gerar sequência de letras:

declare @Tabela table
( COL1 INT,  COL2 VARCHAR(1));

insert into @Tabela values
(75, NULL),
(78, ‘C’),
(12, ‘B’),
(24, ‘D’)

;with CTE_Rec (COL1, COL2) as
(
select
COL1,
COL2
from @Tabela

union all

select
COL1,
case when ASCII(COL2) > 66 then CAST(CHAR(ASCII(COL2) – 1) AS VARCHAR(1))  end
from CTE_Rec as c
where
COL2 is not null
)

select
COL1,
COL2
from CTE_Rec
order by
COL1,
COL2

Go

 

9 – Exemplo – Quantidade de Linhas – Todas as Tables:

— Exemplo 1 —
SELECT t.[name], p.[rows]
FROM sys.schemas s INNER JOIN sys.tables t
ON t.[schema_id] = s.[schema_id]
INNER JOIN sys.indexes i
ON i.[object_id] = t.[object_id]
AND i.[type] IN (0,1)
INNER JOIN sys.partitions p
ON p.[object_id] = t.[object_id]
AND p.[index_id] = i.[index_id]
Go

— Exemplo 2 —
;With Contador (name, rows)
As
(
SELECT t.[name], p.[rows]
FROM sys.schemas s INNER JOIN sys.tables t
ON t.[schema_id] = s.[schema_id]
INNER JOIN sys.indexes i
ON i.[object_id] = t.[object_id]
AND i.[type] IN (0,1)
INNER JOIN sys.partitions p
ON p.[object_id] = t.[object_id]
AND p.[index_id] = i.[index_id]
)
Select name, rows,  ” as soma from Contador
Union all
Select ‘Total’ , Null, convert(varchar(10),sum(rows)) as soma from contador

Go

Caso você queria acessar os demais Short Scripts publicados em 2015, segue abaixo os links:

https://pedrogalvaojunior.wordpress.com/2015/10/21/short-scripts-outubro-2015/

https://pedrogalvaojunior.wordpress.com/2015/08/26/short-scripts-agosto-2015/

https://pedrogalvaojunior.wordpress.com/2015/06/03/short-script-junho-2015/

https://pedrogalvaojunior.wordpress.com/2015/05/04/short-script-maio-2015/

Mais uma vez obrigado por sua visita, espero que estes material posso ser útil e venha a colaborar em seu aprendizado.

Nos encontramos em breve…..

Microsoft SQL Server 2016 – Lista de Novidades – Final


Bom dia, bom dia, bom dia!!!!!

Meu deus que friooooo, neste momento 4.5º graus de temperatura em São Roque e região, para começar o dia esquentando nada como tentar escrever mais um post no meu blog, posso dizer que não é uma missão fácil, pois a chuva de conteúdo que esta na internet sobre o novo Microsoft SQL Server 2016 é algo fora do comum, isso sem falar do lançamento do Microsoft Windows 10 que esta bombando no mundo todo.

Mas deixando esta friozinho de lado e seguindo em frente, vou finalizar esta série de posts relacionados as principais novidades do SQL Server 2016, caso você não tenha acessado os outros dois, segue abaixo os links para sua diversão:

Para finalizar esta série, vou destacar na lista de principais novidades liberadas pela Microsoft as seguintes features:

  • Strech Database;
  • Row-Level Security; e
  • Dynamic Data Masking.

Analisando os nomes das features parece que esta se referindo a algo de outro mundo, mas na verdade não é bem assim, todas elas fazem parte de uma lista de solicitações de profissionais da área de banco de dados, que constantemente estão solicitando aos times dos mais diversos níveis de relacionamento com o SQL Server: http://blogs.technet.com/b/sqlserverbrasil/, http://blogs.msdn.com/b/pfebrasilsql/a introdução destes recursos.

Vamos lá:

Strech Database: Outra nova funcionalidade bastante esperada principalmente para os usuários do Azure, através do Strech Database, será possível armazenar porções (partes) de uma tabela no Azure SQL Database, você pode estar se perguntando, como assim partes de uma tabela em outro local e não no meu banco de dados, posso dizer que também fiquei surpreso, mas tudo tem uma explicação.

Através deste recurso, temos a capacidade de armazenar dados históricos contidos em uma tabela de forma segura e transparente diretamente na nuvem, ou melhor dizendo no Microsoft Azure. A partir do momento que este recurso é habilitado, de forma silenciosa os dados considerados históricos são migrados para um banco SQL Azure, tudo isso é feito pelo SQL Server sem exigir qualquer alteração de código em sua query ou aplicação.

Para saber mais sobre este recurso acesse:

 

Row-Level Security: Esta nova funcionalidade poderá ser considerada algo bastante revolucionário no que se dizer respeito a visibilidade e acesso aos dados de uma tabela. A Row-Level Security vai permitir aos DBAs e profissionais da área de banco de dados, realizar um controle de acesso aos dados que estão armazenados em determinadas tabelas, através do uso de funções conhecidas como Predicate, limitando assim que uma possível coluna e seu respectivo valor seja consultado.

Veja um exemplo abaixo que pode ser aplicado já na versão CTP 2.1 e CTP 2.2 do SQL Server 2016:

— Criando novas contas de usuários –

CREATE USER Manager WITHOUT LOGIN;

CREATE USER Sales1 WITHOUT LOGIN;

CREATE USER Sales2 WITHOUT LOGIN;

Go

 

— Criando a Tabela Sales —

CREATE TABLE Sales

(

OrderID int,

SalesRep sysname, — Este é um dos segredos para o RSL funcionar.

Product varchar(10),

Qty int);

Go

— Inserindo dados na tabela –

INSERT Sales VALUES

(1, ‘Sales1’, ‘Valve’, 5),

(2, ‘Sales1’, ‘Wheel’, 2),

(3, ‘Sales1’, ‘Valve’, 4),

(4, ‘Sales2’, ‘Bracket’, 2),

(5, ‘Sales2’, ‘Wheel’, 5),

(6, ‘Sales2’, ‘Seat’, 5);

Go

 

— Consultando os dados —

SELECT * FROM Sales;

Go

 

— Atribuíndo a permissão de Grant para cada usuários na tabela Sales –

GRANT SELECT ON Sales TO Manager;

GRANT SELECT ON Sales TO Sales1;

GRANT SELECT ON Sales TO Sales2;

Go

 

— Criando o Schema Security –

CREATE SCHEMA Security;

GO

 

— Criando a Função Predicate – Security.fn_securitypredicate –

CREATE FUNCTION Security.fn_securitypredicate(@SalesRep AS sysname)

RETURNS TABLE

WITH SCHEMABINDING

AS

RETURN SELECT 1 AS fn_securitypredicate_result

WHERE @SalesRep = USER_NAME() OR USER_NAME() = ‘Manager’;

 

— Criando a Política de Segurança para filtrar e controlar o acesso aos Dados –

CREATE SECURITY POLICY SalesFilter

ADD FILTER PREDICATE Security.fn_securitypredicate(SalesRep)

ON dbo.Sales

WITH (STATE = ON);

 

— Realizando o teste de acesso aos dados –

EXECUTE AS USER = ‘Sales1’;

SELECT * FROM Sales;

REVERT;

 

EXECUTE AS USER = ‘Sales2’;

SELECT * FROM Sales;

REVERT;

 

EXECUTE AS USER = ‘Manager’;

SELECT * FROM Sales;

REVERT;

 

Após executar este bloco de código você vai poder observar que o usuário Manager deverá ter conseguido consultar todos os dados da Tabela Sales, já os usuários Sales1 e Sales2 devem ter visto somente 3 cada respectivamente.

 

— Agora vamos desativar a política de segurança –

ALTER SECURITY POLICY SalesFilter

WITH (STATE = OFF);

Go

 

Com isso todos os usuários vão conseguir obter todos os dados da tabela Sales.

Dynamic Data Masking: Traduzindo ao pé da letra – Mascaramento de dados dinâmicos, poxa vida, dizer que o SQL Server é mascarado é brincadeir(kkkkk), na verdade este recurso possibilita que seja aplicado diretamente ao dado um máscara, isso mesmo, definir uma máscara para personalizar as informações que serão apresentadas para o usuário em colunas com dados sensitivos.

O Dynamic Data Masking, limita a exposição de dados confidenciais mascarandoo para usuários não-privilegiados. Mascaramento de dados dinâmico ajuda a evitar o acesso não autorizado a dados confidenciais, permitindo aos clientes designar o quanto os dados confidenciais para revelar com impacto mínimo na camada de aplicação. É uma característica de segurança que esconde os dados no conjunto de resultados de uma consulta sobre campos de banco de dados designado, enquanto os dados no banco de dados não são alterados. Considerado de fácil de utilização com aplicativos existentes, desde que as regras de mascaramento sejam aplicadas nos resultados da consulta. Muitos aplicativos podem mascarar dados confidenciais sem modificar consultas existentes.

Mascaramento de dados dinâmicos é complementar a outras características de segurança do SQL Server (auditoria, criptografia, segurança de nível de linha…) e é altamente recomendável usar esse recurso em conjunto com eles, além disso, a fim de melhor proteger os dados confidenciais no banco de dados.

Para conhecer mais sobre este novo recurso acesse:

Ufa, chegamos ao final, mais uma jornada vencida!!!

Agradeço a sua visita ao meu blog, espero que tenho gostado, nos próximos posts tentarei apresentar e exemplificar um pouco mais sobre algumas destas novas funcionalidades.

Um grande abraço.

Microsoft SQL Server 2016 – Lista de Novidades – Parte II


Bom dia, quinta – feira, começando!!!

Salve comunidade, estou retornando com a segunda parte da Lista de Novidades do Microsoft SQL Server 2016, nova versão do SQL Server que neste momento apresenta muitas especulações, comentários e informações nas Internet, principalmente nas redes sociais.

Por este motivo também não poderia ficar de fora, como já realizado na semana passada com a primeira parte desta lista de novidades, caso você não tenha acessado este é o link:
https://pedrogalvaojunior.wordpress.com/2015/07/10/microsoft-sql-server-2016-lista-de-novidades-parte-i/

Nesta segunda parte, vou destacar mais algumas das principais novidades que a Microsoft esta divulgado em seus Blogs e parceiros, hoje darei destaque para:

  • Multiple TempDB Files;
  • For JSON;
  • Always Encripted; e
  • Polybase.

A seguir destaco estas novidades, através de uma breve descrição:

  • Multiple TempDB Files – Funcionalidade muito aguardada a anos pelos profissionais da área de banco de dados, mais especificamente aqueles que trabalham com o SQL Server, onde a partir da versão 2016, teremos a possibilidade de durante a instalação do SQL Server configurar e definir a quantidade arquivos de dados que devem formar a estrutura do banco de sistema TempDB, onde o número de arquivos é definido com base no seu número de processadores que a instância 2016 estará sendo executada. Para saber mais sobre esta nova feature acesse: http://www.sqlservergeeks.com/tempdb-configuration-sql-server-2016-setup/

 

  • FOR JSON – Uma novidade bastante interessante que mostra o quanto a Microsoft esta se dedicando a acompnhar a evolução das tecnologias de Computação em Nuvem e BigData. A FOR JSON, consiste em uma claúsula da linguagem Transact-SQL criada para ajudar o SQL Server a possibilitar a apresentação e saída de dados no formata JSON de forma nativa, algo que vai muito além de apresentar os dados, mas sim ter a capacidade de formatar estes dados interpretados pelo JSON no formato desejado pelo usuário. Para saber mais sobre esta nova feature acesse: https://msdn.microsoft.com/en-us/library/bb510411%28v=sql.130%29.aspx#ForJson

 

  • Always Encrypted – Este é um recurso bastante interessante na minha opinião e algo que pode complementar o TDE(Transparent Data Encryption) recurso introduzido no Microsoft SQL Server 2008, com a finalidade de permitir criptografia nativa no nível de banco de dados. O Always Encrypted garantir ainda mais que seus dados estão armazenados de forma segura através deste recurso de criptografia, como também, durante os processos de manipulação dos mesmo. Sua principal característica é permitir que a possibilidade de criptografar dados dentro das aplicações que estão fazendo acesso ao SQL Server, tendo a capacidade de utilizar chaves de criptografia nunca reveladas dentro do processo que realização da criptografia do dado. Como resultado, o Always Encrypted fornece uma separação entre aqueles que possuem os dados (e pode visualizálo) e aqueles que gerenciar os dados (mas deve não têm acesso). Para saber mais sobre esta nova funcionalidade, acesse: https://msdn.microsoft.com/en-us/library/mt163865(v=sql.130).aspx e https://channel9.msdn.com/Shows/Data-Exposed/SQL-Server-2016-Always-Encrypted

 

  • Polybase – Na minha opinião uma baita novidade, sinceramente algo que vai muito além de uma novo recurso, mas sim um novo horizonte para os profissionais, desenvolvedores e administradores de banco de dados, funcionalidade que vai permitir um avanço enorme no que se diz respeito a Interoperabilidade do SQL Server com outras tecnologias Non-SQL, como também, tecnologias de acesso e armazenamento de dados dentre elas o Hadoop. O PolyBase é uma nova tecnologia que integra o produto o Microsoft SQL Server Parallel Data Warehouse (PDW), com Hadoop. Ele é projetado para permitir consultas através de dados relacionais armazenados no PDW e dados não-relacionais armazenados no Hadoop de forma distribuída através do sistema arquivos Hadoop (HDFS), ignorando MapReduce distribuído, reconhecido como motor do Hadoop que normalmente é usado para ler dados do HDFS. Você pode criar uma tabela externa em PDW que referencia o Hadoop dados (como um servidor vinculado) e você pode consultar isso com SQL, em essência, adicionando estrutura para dados não-estruturados.

Untitled picturePara maiores informações sobre o Polybase e alguns cenários de uso, acesse: Books Online – Polybase, Polybase Explained, SQL Server 2016 and Polybase, Using Polybase in SQL Server 2016, Polybase in SQL Server 2016 CTP2

Muito bem pessoal, chegamos ao final desta segunda parte da lista de novidades do Microsoft SQL Server 2016, espero que você tenha gostado, na próxima semana chegaremos ao final desta lista, destacando as últimas novidades que Microsoft esta introduzindo no novo SQL Server 2016, dentre as quais chamo sua atenção para: Strech Database e Row-Level Security.

Mais uma vez obrigado por sua visita, fique a vontade para postar suas dúvidas, sugestões, críticas e comentários, sobre este ou qualquer outro post.

Boa semana e até mais.