Partilhar via


CRIAR SEQUÊNCIA (Transact-SQL)

Aplica-se a:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceBase de dados SQL no Microsoft Fabric

Cria um objeto de sequência e especifica suas propriedades. Uma sequência é um objeto vinculado ao esquema definido pelo usuário que gera uma sequência de valores numéricos de acordo com a especificação com a qual a sequência foi criada. A sequência de valores numéricos é gerada em ordem crescente ou decrescente em um intervalo definido e pode ser configurada para reiniciar (ciclo) quando esgotada.

As sequências, ao contrário das colunas de identidade, não estão associadas a tabelas específicas. Os aplicativos referem-se a um objeto de sequência para recuperar seu próximo valor. A relação entre sequências e tabelas é controlada pelo aplicativo. Os aplicativos de usuário podem fazer referência a um objeto de sequência e coordenar os valores em várias linhas e tabelas.

Ao contrário dos valores das colunas de identidade que são gerados quando as linhas são inseridas, um aplicativo pode obter o próximo número de sequência sem inserir a linha chamando o PRÓXIMO VALOR PARA. Use sp_sequence_get_range para obter vários números de sequência de uma só vez.

Para obter informações e cenários que usam ambos CREATE SEQUENCE e a NEXT VALUE FOR função, consulte Números de sequência.

Transact-SQL convenções de sintaxe

Sintaxe

CREATE SEQUENCE [ schema_name . ] sequence_name
    [ AS [ built_in_integer_type | user-defined_integer_type ] ]
    [ START WITH <constant> ]
    [ INCREMENT BY <constant> ]
    [ { MINVALUE [ <constant> ] } | { NO MINVALUE } ]
    [ { MAXVALUE [ <constant> ] } | { NO MAXVALUE } ]
    [ CYCLE | { NO CYCLE } ]
    [ { CACHE [ <constant> ] } | { NO CACHE } ]
    [ ; ]

Arguments

sequence_name

Especifica o nome exclusivo pelo qual a sequência é conhecida no banco de dados. Type é sysname.

[ built_in_integer_type | utilizador-defined_integer_type ]

Uma sequência pode ser definida como qualquer tipo inteiro. São permitidos os seguintes tipos.

  • tinyint - Intervalo 0 a 255
  • smallint - Intervalo -32.768 a 32.767
  • int - Intervalo -2.147.483.648 a 2.147.483.647
  • bigint - Intervalo -9.223.372.036.854.775.808 a 9.223.372.036.854.775.807
  • decimal e numérico com uma escala de 0.
  • Qualquer tipo de dados definido pelo usuário (tipo de alias) baseado em um dos tipos permitidos.

Se nenhum tipo de dados for fornecido, o tipo de dados bigint será usado como padrão.

COMEÇAR COM <constante>

O primeiro valor retornado pelo objeto de sequência. O START valor deve ser um valor menor ou igual ao máximo e maior ou igual ao valor mínimo do objeto de sequência. O valor inicial padrão para um novo objeto de sequência é o valor mínimo para um objeto de sequência ascendente e o valor máximo para um objeto de sequência decrescente.

INCREMENTO POR <constante>

Valor usado para incrementar (ou diminuir, se negativo) o valor do objeto de sequência para cada chamada para a NEXT VALUE FOR função. Se o incremento for um valor negativo, o objeto de sequência será decrescente; caso contrário, é ascendente. O incremento não pode ser 0. O incremento padrão para um novo objeto de sequência é 1.

[ Constante< MINVALUE >| SEM MINVALUE ]

Especifica os limites para o objeto de sequência. O valor mínimo padrão para um novo objeto de sequência é o valor mínimo do tipo de dados do objeto de sequência. Isso é zero para o tipo de dados tinyint e um número negativo para todos os outros tipos de dados.

[ Constante< MAXVALUE >| SEM MAXVALUE

Especifica os limites para o objeto de sequência. O valor máximo padrão para um novo objeto de sequência é o valor máximo do tipo de dados do objeto de sequência.

[ CICLO | SEM CICLO ]

Propriedade que especifica se o objeto de sequência deve reiniciar a partir do valor mínimo (ou máximo para objetos de sequência decrescente) ou lançar uma exceção quando seu valor mínimo ou máximo for excedido. A opção de ciclo padrão para novos objetos de sequência é NO CYCLE.

Observação

Pedalar um SEQUENCE reinicia a partir do valor mínimo ou máximo, não do valor inicial.

[ CACHE [ <constante> ] | SEM CACHE ]

Aumenta o desempenho para aplicativos que usam objetos de sequência, minimizando o número de E/S de disco necessárias para gerar números de sequência. O padrão é CACHE.

Por exemplo, se um tamanho de cache de 50 for escolhido, o SQL Server não manterá 50 valores individuais armazenados em cache. Ele armazena em cache apenas o valor atual e a quantidade de valores deixados no cache. Isso significa que a quantidade de memória necessária para armazenar o cache é sempre duas instâncias do tipo de dados do objeto de sequência.

Observação

Se a opção de cache estiver habilitada sem especificar um tamanho de cache, o Mecanismo de Banco de Dados selecionará um tamanho. No entanto, os usuários não devem confiar que a seleção seja consistente. A Microsoft pode alterar o método de cálculo do tamanho do cache sem aviso prévio.

Quando criado com a opção, um desligamento CACHE inesperado (como uma falha de energia) pode resultar na perda de números de sequência restantes no cache.

Observações

Os números de sequência são gerados fora do escopo da transação atual. Eles são consumidos independentemente de a transação que usa o número de sequência ser confirmada ou revertida. A validação duplicada só ocorre quando um registro é totalmente preenchido. Isso pode resultar em alguns casos em que o mesmo número é usado para mais de um registro durante a criação, mas depois é identificado como uma duplicata. Se isso ocorrer e outros valores de numeração automática tiverem sido aplicados a registros subsequentes, isso pode resultar em uma lacuna entre os valores de numeração automática e o comportamento esperado.

Gerenciamento de cache

Para melhorar o desempenho, o CACHE SQL Server pré-aloca o número de números de sequência especificados pelo argumento.

Por exemplo, uma nova sequência é criada com um valor inicial de 1 e um tamanho de cache de 15. Quando o primeiro valor é necessário, os valores de 1 a 15 são disponibilizados a partir da memória. O último valor armazenado em cache (15) é gravado nas tabelas do sistema no disco. Quando todos os 15 números forem usados, a próxima solicitação (para o número 16) fará com que o cache seja alocado novamente. O novo último valor armazenado em cache (30) é gravado nas tabelas do sistema.

Se o Mecanismo de Banco de Dados for interrompido depois que você usar 22 números, o próximo número de sequência pretendido na memória (23) será gravado nas tabelas do sistema, substituindo o número armazenado anteriormente.

Depois que o SQL Server é reiniciado e um número de sequência é necessário, o número inicial é lido das tabelas do sistema (23). A quantidade de cache de 15 números (23-38) é alocada para a memória e o próximo número não cache (39) é gravado nas tabelas do sistema.

Se o Mecanismo de Banco de Dados parar anormalmente em um evento como uma falha de energia, a sequência será reiniciada com o número lido das tabelas do sistema (39). Todos os números de sequência alocados na memória (mas nunca solicitados por um usuário ou aplicativo) são perdidos. Essa funcionalidade pode deixar lacunas, mas garante que o mesmo valor nunca será emitido duas vezes para um único objeto de sequência, a menos que seja definido como CYCLE ou seja reiniciado manualmente.

O cache é mantido na memória rastreando o valor atual (o último valor emitido) e a quantidade de valores deixados no cache. Portanto, a quantidade de memória usada pelo cache é sempre duas instâncias do tipo de dados do objeto de sequência.

Definir o argumento cache para NO CACHE gravar o valor da sequência atual nas tabelas do sistema sempre que uma sequência é usada. Isso pode diminuir o desempenho aumentando o acesso ao disco, mas reduz a chance de lacunas não intencionais. Lacunas ainda podem ocorrer se os números forem solicitados usando as NEXT VALUE FOR funções ou sp_sequence_get_range , mas os números não são usados ou são usados em transações não confirmadas.

Quando um objeto de sequência usa a CACHE opção, se você reiniciar o objeto de sequência ou alterar as INCREMENTpropriedades , CYCLE, MINVALUE, MAXVALUE, ou o tamanho do cache, isso fará com que o cache seja gravado nas tabelas do sistema antes que a alteração ocorra. Em seguida, o cache é recarregado começando com o valor atual (ou seja, nenhum número é ignorado). A alteração do tamanho do cache entra em vigor imediatamente.

Opção CACHE quando os valores armazenados em cache estão disponíveis

O processo a seguir ocorre sempre que um objeto de sequência é solicitado a gerar o próximo valor para a CACHE opção se houver valores não utilizados disponíveis no cache na memória para o objeto de sequência.

  1. O próximo valor para o objeto de sequência é calculado.
  2. O novo valor atual para o objeto de sequência é atualizado na memória.
  3. O valor calculado é retornado para a instrução de chamada.

Opção CACHE quando o cache estiver esgotado

O processo a seguir ocorre sempre que um objeto de sequência é solicitado a gerar o próximo valor para a CACHE opção se o cache estiver esgotado:

  1. O próximo valor para o objeto de sequência é calculado.

  2. O último valor para o novo cache é calculado.

  3. A linha da tabela do sistema para o objeto de sequência está bloqueada e o valor calculado na etapa 2 (o último valor) é gravado na tabela do sistema. Um Evento Estendido esgotado em cache é acionado para notificar o usuário sobre o novo valor persistente.

Opção SEM CACHE

O seguinte processo ocorre sempre que um objeto de sequência é solicitado para gerar o próximo valor para a NO CACHE opção:

  1. O próximo valor para o objeto de sequência é calculado.
  2. O novo valor atual para o objeto de sequência é gravado na tabela do sistema.
  3. O valor calculado é retornado para a instrução de chamada.

Metadados

Para obter informações sobre sequências, consulte sys.sequences.

Segurança

Permissions

Requer CREATE SEQUENCE, , ou ALTER permissão no CONTROLSCHEMA.

  • Os membros do db_owner e db_ddladmin funções de banco de dados fixas podem criar, alterar e soltar objetos de sequência.
  • Os membros do db_owner e db_datawriter funções de banco de dados fixas podem atualizar objetos de sequência fazendo com que eles gerem números.

O exemplo a seguir concede ao usuário AdventureWorks\Larry permissão para criar sequências no Test esquema.

GRANT CREATE SEQUENCE
    ON SCHEMA::Test TO [AdventureWorks\Larry];

A propriedade de um objeto de sequência pode ser transferida usando a ALTER AUTHORIZATION instrução.

Se uma sequência usa um tipo de dados definido pelo usuário, o criador da sequência deve ter REFERENCES permissão sobre o tipo.

Audit

Para auditar CREATE SEQUENCE, monitore o SCHEMA_OBJECT_CHANGE_GROUP.

Examples

Para obter exemplos de criação de sequências e uso da NEXT VALUE FOR função para gerar números de sequência, consulte Números de sequência.

A maioria dos exemplos a seguir cria objetos de sequência em um esquema chamado Test.

Para criar o esquema Test, execute a instrução a seguir.

CREATE SCHEMA Test;
GO

A. Criar uma sequência que aumente em 1

No exemplo a seguir, Thierry cria uma sequência chamada CountBy1 que aumenta um a cada vez que é usada.

CREATE SEQUENCE Test.CountBy1
    START WITH 1
    INCREMENT BY 1;
GO

B. Criar uma sequência que diminui em 1

O exemplo a seguir começa em 0 e conta em números negativos por um cada vez que é usado.

CREATE SEQUENCE Test.CountByNeg1
    START WITH 0
    INCREMENT BY -1;
GO

C. Criar uma sequência que aumente em 5

O exemplo a seguir cria uma sequência que aumenta em 5 toda vez que é usada.

CREATE SEQUENCE Test.CountBy1
    START WITH 5
    INCREMENT BY 5;
GO

D. Criar uma sequência que começa com um número designado

Depois de importar uma tabela, Thierry nota que o número de identificação mais alto usado é 24.328. Thierry precisa de uma sequência que gere números a partir de 24.329. O código a seguir cria uma sequência que começa com 24.329 e aumenta em 1.

CREATE SEQUENCE Test.ID_Seq
    START WITH 24329
    INCREMENT BY 1;
GO

E. Criar uma sequência usando valores padrão

O exemplo a seguir cria uma sequência usando os valores padrão.

CREATE SEQUENCE Test.TestSequence;

Execute a instrução a seguir para exibir as propriedades da sequência.

SELECT *
FROM sys.sequences
WHERE name = 'TestSequence';

Uma lista parcial da saída demonstra os valores padrão.

Resultado Valor predefinido
start_value -9223372036854775808
increment 1
minimum_value -9223372036854775808
maximum_value 9223372036854775807
is_cycling 0
is_cached 1
current_value -9223372036854775808

F. Criar uma sequência com um tipo de dados específico

O exemplo a seguir cria uma sequência usando o tipo de dados smallint , com um intervalo de -32.768 a 32.767.

CREATE SEQUENCE SmallSeq
    AS SMALLINT;

G. Criar uma sequência usando todos os argumentos

O exemplo a seguir cria uma sequência chamada DecSeq usando o tipo de dados decimal , com um intervalo de 0 a 255. A sequência começa com 125 e aumenta em 25 cada vez que um número é gerado. Como a sequência é configurada para ciclo quando o valor excede o valor máximo de 200, a sequência é reiniciada com o valor mínimo de 100.

CREATE SEQUENCE Test.DecSeq
    AS DECIMAL (3, 0)
    START WITH 125
    INCREMENT BY 25
    MINVALUE 100
    MAXVALUE 200
    CYCLE
    CACHE 3;

Execute a seguinte instrução para ver o primeiro valor; a START WITH opção de 125.

SELECT  NEXT VALUE FOR Test.DecSeq;

Execute a instrução mais três vezes para retornar 150, 175 e 200.

Execute a instrução novamente para ver como o valor inicial volta para a MINVALUE opção de 100.

Execute o código a seguir para confirmar o tamanho do cache e ver o valor atual.

SELECT cache_size, current_value
FROM sys.sequences
WHERE name = 'DecSeq';