SQL 2011 – Sequences

Outra grande novidade do SQL Server 2011 são os objetos “sequence” (Sequencia), ja existem outros SGDBs onde este objeto ja é implementado a algumas versões, porem só nesta nova versão o mesmo foi introduzido ao SQL Server.

É comum ver em algumas modelagens de banco de dados os seguintes relacionamentos:

Até o SQL Server 2008, iste tipo de modelagem só era possivel de 3 maneiras:

  • Alterando-se as chaves primarias das tabelas Cliente e Funcionario para uma chave primaria composta.

Problema: Voce tera um campo a mais de PK em sua tabela, maior ocupação de espaço em disco, leitura e entendimento um pouco complicado.

  • Utilizando do datatype UNIQUEIDENTIFIER e a função NEWID().

Problema: O UNIQUEIDENTIFIER ira gerar um valor parecido com este: 534A9F7D-6CB7-44A2-9EA5-F6E08795D53E.

  • Utilizando por exemplo PK IDENTITY(1,2) (Numeros impares) para uma tabela e PK IDENTITY (2,2) (Numeros pares) para a outra tabela.

Problema: Dados confusos, principalmente se por algum motivo voce tiver que remover algum dado, ou alterar.

Pode haver lacunas, por exemplo, se voce inserir 3 linhas em uma tabela, e apenas 1 na outra, voce tera 2 lacunas em PK na tabela que recebeu menos dados.

 

Com o novo objeto sequence, este tipo de modelagem se torna mais facil tanto em sua implementação quanto em seu gerenciamento. Este objeto é criado pela seguinte sintaxe:

[sql] CREATE SEQUENCE Schema.SequenceName
AS INT
MINVALUE 0,
NO MAXVALUE,
START WITH 1,
INCREMENT BY 1
[/sql]

Considerações:

  • O nivel de permissionamento em relação aos objetos sequence continua igual em relação aos outros objetos, podendo ser diretamente ou por schema;
  • Por mais que voce possa definir um valor maximo e minimo, os limites de cada datatype na definição serão respeitados, por exemplo, na sequence criada acima, o range de valores possiveis é:-2^31 (-2,147,483,648) a 2^31-1 (2,147,483,647), que representa o menor e maior valor possivel para um dado INT respectivamente.

Voltando ao nosso modelo relacional, com o uso de sequence, o insert nas tabelas de Cliente e Funcionario seriam:

[sql] INSERT INTO Cliente VALUES (NEXT VALUE FOR Schema.SequenceName, ‘Fabrizzio’)
INSERT INTO Funcionario VALUES (NEXT VALUE FOR Schema.SequenceName, ‘Caputo’)
[/sql]

Vantagens da utilização de sequences:

  • Maior facilidade de implementação;
  • Não havera lacunas (Caso não haja erros ou deleções);
  • Possibilidade de gerenciamento do objeto sequence atraves do comando ALTER SEQUENCE;
  • Maior controle dos seus dados;
  • Facil manutenção;
  • Possibilidade de reserva de ranges;
  • Mais rapido que o IDENTITY.

Desvantagens:

  • Não trabalha por transação, ou seja:

[sql] CREATE dbo.SequenciaTeste
AS INT
START WITH 1,
INCREMENT BY 1
 
BEGIN TRAN
SELECT NEXT VALUE FOR dbo.SequenciaTeste
ROLLBACK TRAN
SELECT NEXT VALUE FOR dbo.SequenciaTeste
[/sql]

Resultado: 1 e 2, Ou seja, não foi feito o Rollback do valor da sequence. Portanto no caso de erro ou rollback da transação, voce perdeu este valor da sequencia, sera necessario insert manual do mesmo na tabela.