Utilizando o Tipo de Dados rowversion para identificar a seqüência de manipulação de registros no Microsoft SQL Server 2008 R2.

Pessoal, boa tarde.

Tudo bem?

Bom, hoje quero apresentar algo que eu particularmente conheci há poucos dias e acabou me chamando a atenção de como poderia ser utilizado. Estou me referindo ao rowversion.

Você conhece? Já utilizou? Sabe de que forma ele pode ser utilizado? Para tentar responder a estas e demais questões, elaborei um pequeno questionário que visa ilustrar com comportamento do rowversion e demais recursos que estão envolvidos com o mesmo.

1. O que é o rowversion?

O rowversion é um Tipo de Dados existente exclusivamente no Microsoft SQL Server, que trabalha com valores de números binários gerados de forma automática pelo Mecanismo de Banco de dados.

2. Como estes valores são gerados pelo Mecanismo de Banco de Dados?

A cada manipulação de registros realizada nas tabelas que possui o rowversion, o Mecanismo de Banco de Dados do Microsoft SQL Server, atualiza o contador de manipulações existente, efetuando o incremento do mesmo de forma seqüência e exclusiva para o banco de dados ao qual a mesmo esta vinculada.

3. O contador de manipulações de registros é utilizado para todos os bancos de dados e objetos?

Não, para cada banco de dados o Mecanismo de banco de dados do Microsoft SQL Server cria o seu próprio contador, que esta disponível para todos os objetos existentes no Banco de Dados. Onde este contador vai obter e gerar a numeração binária exclusiva, sempre de forma incremental, descartando o valor anterior que não poderá ser mais utilizado neste repositório.

4. Posso utilizar mais de uma coluna do tipo rowversion por Tabela?

Não, por questões de integridade e controle de manipulações, é possível criar somente uma única coluna do tipo rowversion por tabela, independente do banco de dados já possuir outras tabelas com este tipo. Esta regra se aplica ao nível de objetos.

5. Este tipo de dados pode ser utilizado em coluna Chave Primária ou Chaves de Acesso?

Como o comportamento rowversion esta vinculado com a modificação e inserção de dados, isso acaba limitando em muito a possibilidade de uma coluna do tipo rowversion se tornar a chave primária ou coluna chave para pesquisa de dados, devido a substituição constante dos valores gerados pelo contator a cada linha de registro manipulada.

6. Existe algum risco ou impacto em utilizar uma coluna rowversion como Chave Primária?

Sim, podemos nos deparar com riscos na integridade e consistência ao se utilizar este tipo de dado para uma coluna que esteja definida como chave primária ou até mesmo envolvida em um relacionamento físico.

Devido ao seu comportamento, se a coluna rowversion for uma chave primária, devemos ter em mente que a cada manipulação o contador binário seqüencial é incrementado, fazendo com que o valor antigo existente para esta coluna seja atualizado, com isso nossas chaves estrangeiras que fazem uso destes valores está totalmente desatualizado, o que ira quebrar integridade e veracidade dos dados.

Além destes riscos, podemos também sobre impactos de desempenho caso uma coluna rowversion venha a ser utilizada ou envolvida com índices, pois ao executarmos uma manipulação de dados, o mecanismo de banco de dados deverá gerar a atualização do contador seqüencial tanto na tabela como também no índice ao qual esta envolvida esta coluna.

Outra consideração, esta relacionada ao se utilizar a instrução Select Into para criar uma nova tabela com base no conjunto de registros e estrutura de uma tabela já existente, onde a mesma possua uma coluna do tipo rowversion. Neste cenário, o mecanismo de banco de dados poderá acabar gerando valores binários seqüenciais duplicados durante o processamento desta instrução.

7. Uma coluna rowversion pode ser nula?

O Mecanismo de Banco de Dados existente no Microsoft SQL Server permite e consegui trabalhar com este tipo de dados de forma a possibilitar este esta coluna não tenha o seu preenchimento obrigatório, desta forma, uma coluna rowversion não anulável é semanticamente equivalente a uma coluna binary(8). Uma coluna rowversion anulável é semanticamente equivalente a uma coluna varbinary(8).

8. Quais os recursos podem ser utilizados em conjunto com uma coluna rowversion?

O Rowversion pode ser utilizado de diversas formas no Microsoft SQL Server, desde a Criação de uma tabela, Declaração de variáveis, Stored procedures, Functions, Triggers, etc.

Mas existem recursos que estão relacionados diretamente com este tipo de dados, neste caso destaco:

  • System Function: Min_Active_Rowversion(); e
  • System Variable: @@DBTS.

9. Quais poderiam ser as principais vantagens em seu utilizar uma coluna do tipo Rowversion?

Você pode usar a coluna rowversion de uma linha para determinar facilmente se algum valor na linha foi alterado desde a última vez que foi lida. Se qualquer alteração for feita na linha, o valor de rowversion será atualizado. Se nenhuma alteração for feita na linha, o valor de rowversion será o mesmo que foi lido anteriormente.

Outra vantagem esta relacionada com a possibilidade de se adicionar uma coluna rowversion a uma tabela para ajudar a manter a integridade do banco de dados quando vários usuários estão atualizando as linhas ao mesmo tempo: O que poderá ajudar a identificação de quantas e quais linhas foi atualizado sem consultar novamente a tabela.

Pois bem, acredito que o questionário apresentado anteriormente deve esclarecer em muito as principais dúvidas e curiosidades sobre o rowversion. Agora vamos então trabalhar um pouco com ele, em alguns exemplos, ilustrando maneiras que podemos trabalhar com este tipo de dados:

Exemplo 1 – Criando uma tabela com coluna rowversion e inserindo dados:

CREATE TABLE MyTableRowVersion

(ID int PRIMARY KEY Identity(1,1),

Valores int,

Record rowversion);

GO

INSERT INTO MyTableRowVersion (Valores)

VALUES (IsNull(@@IDENTITY,0));

Go 100

Select Id, Valores, Record from MyTableRowVersion

Podemos observar que após criar a tabela MyTableRowVersion, inserimos 100 linhas de registro para esta coluna, neste caso, o mecanismo de banco de dados realizou o processo de geração de números binários para armazenar na coluna Record, conforme podemos comprovar com a Figura 1 apresentada abaixo, após a execução do comando Select:

Figura 1 – Relação de números binários seqüenciais gerados pelo Mecanismo de Banco de Dados.

Ao executarmos o comando Select, podemos observar que a coluna Record foi preenchida pelo mecanismo de banco de dados com a seqüência de valores numéricos binários gerado pelo contador.

Com isso, podemos obter agora algumas informações sobre o contador gerada para este banco de dados, fazendo uso da System Function: Min_Active_RowVersion() e também da System Variable @@DBTS, através o exemplo abaixo, ilustrado pela Figura 2:

RowVersion1

Exemplo 2 – Consultando informações sobre a coluna Rowversion:

Select MIN_ACTIVE_ROWVERSION() As ‘Min Active Value’

Select @@DBTS As ‘Last Value’

RowVersion2

No processo exemplo, valores realizar um simples Update nas 20 primeiras linhas da Tabela MyTableRowVersion, com isso o contador seqüencial será invocado pelo Mecanismo de banco de dados e a coluna Record será atualizada de acordo com a nova seqüência gerada, conforme apresenta a Figura 3.

Exemplo 3 – Atualizando registros na tabela MyTableRowVersion:

Update MyTableRowVersion

Set Valores = 110

Where Id In (Select Top 20 Id from MyTableRowVersion)

RowVersion3 Figura 3 – Coluna Record atualizada para as 20 primeiras linhas da tabela MyTableRowVersion.

Muito bem, podemos notar que a coluna Record sofre a alteração no conjunto de linhas processadas, tendo o seu valor alterado de acordo com o último valor atribuído para o tipo de dados rowversion dentro do banco de dados.

Sendo assim, estou encerramento mais este simples artigo, espero que você possa ter gostado e entendido como podemos utilizar um simples tipo de dados que poderá se tornar um recurso útil nos processos de integridade e controle de dados manipulados.

Mais uma vez obrigado, nos encontramos em breve.

Até mais.

About these ads

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s