Carregar apresentação
A apresentação está carregando. Por favor, espere
PublicouVergílio Madureira Damásio Alterado mais de 7 anos atrás
1
SQL Saturday #512 Salvando dados históricos com as Temporal Tables do SQL Server 2016 Felipe de Assis Felipe.assis@outlook.com
2
Speaker Bio Felipe de Assis -Consultor SQL Server na DataEX (SP) -MCTS, MCITP, MCSA, MCSE Data Plataform -http://felipedba.wordpress.com -Felipe.assis@outlook.comFelipe.assis@outlook.com -Felipe.assis@dataex.com.brFelipe.assis@dataex.com.br @felipespas https://www.linkedin.com/in/fdassis
3
Patrocinadores
4
Links http://facebook.com/devSQL devsql-subscribe@yahoogrupos.com.br SQL Server Discovery Day http://www.eventbrite.com/e/sql-discovery-day- tickets-25185568714 Utilize nossa hashtag no twitter: #SqlSatRJ
5
SQL Server Discovery Day http://www.eventbrite.com/e/sql-discovery-day-tickets-25185568714 25/06
6
Macro Agenda 1.Introdução 2.Criando Tabelas Temporais 3.Demonstração 1 4.Manipulando dados 5.Possíves Aplicações 6.Demonstração 2 7.Considerações Finais 8.Conclusão
7
Introdução O que são as Temporal Tables? Um novo tipo de tabela disponível no SQL 16 Qual o objetivo? Manter histórico de mudanças dos dados
8
Por que armazenar dados históricos? Realizar auditoria sobre as modificações/exclusões realizadas Consultar dados referentes à um específico ponto no tempo (Point In Time) Analisar tendências ao longo de um período Controlar versionamento de registros em tabelas (dimensão) em um ambiente DW Recuperar dados acidentalmente modificados/excluídos
9
Por falar em histórico, antes do SQL 16... Como manter dados históricos nas versões anteriores do SQL Server? Estratégias Triggers criadas pelo DBA/Dev Adaptações em Stored Procedures Mudanças em códigos AD-HOC Recursos Change Data Capture Change Tracking SQL Audit
10
Principais Características Implementação transparente às aplicações Nova cláusula: HIDDEN Disponível em todas as edições do SQL 16 System-Versioned: Validade dos registros controlada pelo próprio SQL Server Compatível com outras features In-Memory OLTP, Columnstore Indexes, Strech DB, Compressão de dados, Particionamento de Tabelas
11
Criando uma Tabela Temporal: Modo Automático CREATE TABLE Temporal ( Column01 INT NOT NULL PRIMARY KEY, Column02 VARCHAR(100), Column03 DATETIME, Column04 DECIMAL(10,2), StartDate DATETIME2 GENERATED ALWAYS AS ROW START NOT NULL, EndDate DATETIME2 GENERATED ALWAYS AS ROW END NOT NULL, PERIOD FOR SYSTEM_TIME (StartDate, EndDate) ) WITH (SYSTEM_VERSIONING = ON) Definição das colunas que farão o controle de versão dos registros Configuração do recurso (Tabela de histórico criada automaticamente) Configuração do recurso (Tabela de histórico criada automaticamente) Primary Key requerida
12
Implantando a Feature em uma Tabela já existente CREATE TABLE Historico ( Column01 INT NOT NULL, Column02 VARCHAR(100), Column03 DATETIME, Column04 DECIMAL(10,2), StartDate DATETIME2 NOT NULL, EndDate DATETIME2 NOT NULL ) CREATE TABLE Temporal ( Column01 INT NOT NULL PRIMARY KEY, Column02 VARCHAR(100), Column03 DATETIME, Column04 DECIMAL(10,2) ) ALTER TABLE Temporal ADD StartDate DATETIME2 GENERATED ALWAYS AS ROW START HIDDEN NOT NULL DEFAULT CAST(GETDATE() AS DATETIME2), EndDate DATETIME2 GENERATED ALWAYS AS ROW END HIDDEN NOT NULL DEFAULT CAST('9999-12-31 23:59:59.9999999' AS DATETIME2), PERIOD FOR SYSTEM_TIME (StartDate, EndDate) ALTER TABLE Temporal SET (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.Historico)) GO Configuração do recurso Colunas Temporais Parâmetro HIDDEN Colunas Temporais Parâmetro HIDDEN Tabela de Histórico Passo Opcional Tabela de Histórico Passo Opcional
13
DEMONSTRAÇÃO... Cenário comum: Implementação do recurso sobre uma tabela já existente.
14
Inserindo dados nas Temporal Tables 1.Aplicação dispara um INSERT / BULK INSERT / MERGE 2.O registro é inserido na tabela temporal Tabela TemporalTabela Histórico QtdeStartTimeEndTime 102015-11-21 11:009999-12-31 23:59 INSERT MyTable (Qtde) VALUES (10)
15
Atualizando dados nas Temporal Tables 1.Aplicação envia comando UPDATE / MERGE 2.O registro é copiado para a tabela de histórico 3.O registro enfim é atualizado na tabela temporal QtdeStartTimeEndTime 102015-11-21 11:009999-12-31 23:59 QtdeStartTimeEndTime 102015-11-21 11:002016-06-18 13:30 QtdeStartTimeEndTime 152016-06-18 13:309999-12-31 23:59 Tabela Temporal Tabela Histórico UPDATE Temporal SET Qtd = 15 WHERE Codigo = 1 UPDATE Temporal SET Qtd = 20 WHERE Codigo = 1 152016-06-18 13:302016-06-18 13:45 QtdeStartTimeEndTime 202016-06-18 13:459999-12-31 23:59
16
Deletando dados nas Tabelas Temporais 1.Aplicação envia comando DELETE / MERGE 2.O registro é copiado para a tabela histórico 3.O registro enfim é removido da tabela temporal Tabela Temporal Tabela Histórico QtdeStartTimeEndTime 102015-11-21 11:009999-12-31 23:59 QtdeStartTimeEndTime 102015-11-21 11:002015-11-21 11:30 DELETE MyTable WHERE Codigo = 1
17
Selecionando dados: Como funciona? Tabela TemporalTabela Histórico SQL Server 2016 UNION 152015-11-21 11:309999-12-31 23:59 QtdeStartTimeEndTime 102015-11-21 11:002015-11-21 11:30 1.Aplicação dispara comando SELECT usando as novas cláusulas T-SQL 2.As duas tabelas são acessadas e os resultados são combinados
18
Viagens no Tempo via T-SQL Linha do Tempo SELECT Colunas FROM Tabela AS F WHERE Filtro = Predicado Agora SELECT Colunas FROM Tabela FOR SYSTEM_TIME AS OF ’2016-06-17 14:30’ AS F WHERE Filtro = Predicado Ontem, 14h30
19
Novas Cláusulas T-SQL SELECT ColumnsList FROM MyTemporalTable FOR SYSTEM_TIME AS OF '2015-11-21 11:00:00.0000000' WHERE FilterColumn = 1 AS OF FROM...TO BETWEEN...AND CONTAINED IN FOR SYSTEM_TIME @PointInTime @Start... @End ALL
20
Consultando dados da forma tradicional Linha do Tempo 01/01/2016 Agora Value A Value B Value A Query Tradicional (2 rows) Value B ID 1 ID 2 ID 3
21
Usando a cláusula SYSTEM TIME ALL Linha do Tempo 01/01/2016 Agora Value A Value B Value A Value B SYSTEM TIME ALL (5 rows) ID 1 ID 2 ID 3
22
Usando a cláusula SYSTEM TIME AS OF Linha do Tempo 01/01/2016 Agora Value A Value B Value A SYSTEM TIME AS OF (2 rows) Value B ID 1 ID 2 ID 3
23
Usando SYSTEM TIME CONTAINED IN Linha do Tempo 01/01/2016 Agora Value A Value B Value A SYSTEM TIME CONTAINED IN (1 row) Value B ID 1 ID 2 ID 3
24
Usando SYSTEM TIME BETWEEN... AND Linha do Tempo 01/01/2016 Agora Value A Value B Value A SYSTEM TIME BETWEEN... AND (4 rows) Value B ID 1 ID 2 ID 3 Observação: A cláusula FROM...TO é similar à BETWEEN... AND, com apenas uma pequena variação quanto à interpretação do início do intervalo.
25
Principais Cenários de Utilização Auditorias de Dados Análises do tipo “Point In Time” Detecção de Anomalias Slowly-Changing Dimensions (DW) Recuperação de Dados
26
DEMONSTRAÇÃO... Caso de uso Usando as Tabelas Temporais para auditar modificações
27
Considerações Finais Tabelas de Histórico não suportam constraints (PKs, FKs, Checks, Defaults, etc) TRUNCATE e DROP TABLE não são suportados enquanto o recurso estiver ativado Modificações feitas diretamente nas tabelas de histórico não são permitidas
28
Compatibilidade com Funções / Views Views: Cláusulas Temporais são automaticamente aplicadas somente nas tabelas onde o recurso tenha sido implantado. CREATE VIEW V_PosicaoEstoques AS SELECT E.Cod_Estq, P.Cod_Prod, P.Nome_Prod, P.Desc_Prod, A.Nome_Armz, A.End_Armz, E.Qtde_Estq FROM Estoques E INNER JOIN Produtos P ON E.Cod_Prod = P.Cod_Prod INNER JOIN Armazens A ON E.Cod_Armz = A.Cod_Armz GO DECLARE @V DATETIME = GETDATE()-10 SELECT * FROM V_PosicaoEstoques FOR SYSTEM_TIME AS OF @V Functions: Cláusulas Temporais precisam ser adicionadas no código do objeto e os valores passados como um parâmetro. CREATE FUNCTION FN_PosicaoEstoque (@Data DATETIME) RETURNS TABLE AS RETURN( SELECT E.Cod_Estq, P.Cod_Prod,P.Nome_Prod, P.Desc_Prod, A.Nome_Armz, A.End_Armz, E.Qtde_Estq FROM Estoques FOR SYSTEM_TIME AS OF @Data AS E INNER JOIN Produtos P ON E.Cod_Prod = P.Cod_Prod INNER JOIN Armazens A ON E.Cod_Armz = A.Cod_Armz) GO DECLARE @V DATETIME = GETDATE()-10 SELECT * FROM FN_PosicaoEstoque(@V)
29
Compatibilidade com outros Recursos AlwaysOn Availability Groups ColumnStore Index Strech DB Temporal Tables In-Memory OLTP (Hekaton) Data Compression Table Partitioning AlwaysOn Failover Cluster Instances Pode ser combinado com outros recursos, desde que estejam disponíveis na edição utilizada.
30
Exemplo: Compatibilidade de Recursos Tabela Temporal Tabela Histórico Data Compression Strech DB SQL Server 2016Cloud Computing In-Memory OLTP Columnstore Index Table Partitioning Tabela Tradicional
31
Conclusão Novo tipo de tabela no SQL 2016 Manter histórico de dados Disponível em todas as edições Implementação simples e totalmente transparente às aplicações Novas cláusulas T-SQL para facilitar a consulta de dados históricos
32
Links e Referências Técnicas MSDN https://msdn.microsoft.com/en-us/library/dn935015.aspx https://msdn.microsoft.com/en-us/library/dn935015.aspx https://msdn.microsoft.com/en- us/library/mt631669.aspx?f=255&MSPPError=-2147217396 https://msdn.microsoft.com/en- us/library/mt631669.aspx?f=255&MSPPError=-2147217396 https://msdn.microsoft.com/en-us/library/mt604468.aspx https://msdn.microsoft.com/en-us/library/mt604468.aspx SQLMAG (by Itzik Ben-Gan) http://sqlmag.com/sql-server/first-look-system-versioned- temporal-tables-part-1-creating-tables-and-modifying-data http://sqlmag.com/sql-server/first-look-system-versioned- temporal-tables-part-1-creating-tables-and-modifying-data http://sqlmag.com/sql-server/first-look-system-versioned- temporal-tables-part-2-querying-data-and-optimization-conside http://sqlmag.com/sql-server/first-look-system-versioned- temporal-tables-part-2-querying-data-and-optimization-conside
33
Patrocinadores
34
OBRIGADO!
Apresentações semelhantes
© 2024 SlidePlayer.com.br Inc.
All rights reserved.