CRIAR TABELA (Transact-SQL)
Aplica-se a:SQL Server
Banco de Dados SQL do Azure
Instância Gerenciada SQL do Azure
banco de dados SQL no Microsoft Fabric
Cria uma nova tabela no banco de dados.
Observação
Para obter referência ao Warehouse no Microsoft Fabric, visite CREATE TABLE (Fabric Data Warehouse). Para obter referência ao Azure Synapse Analytics and Analytics Platform System (PDW), visite CREATE TABLE (Azure Synapse Analytics).
Transact-SQL convenções de sintaxe
Opções de sintaxe
Sintaxe comum
Sintaxe simples de CREATE TABLE (comum se não estiver usando opções):
CREATE TABLE
{ database_name.schema_name.table_name | schema_name.table_name | table_name }
( { <column_definition> } [ ,... n ] )
[ ; ]
Sintaxe completa
Sintaxe CREATE TABLE baseada em disco:
CREATE TABLE
{ database_name.schema_name.table_name | schema_name.table_name | table_name }
[ AS FileTable ]
( { <column_definition>
| <computed_column_definition>
| <column_set_definition>
| [ <table_constraint> ] [ ,... n ]
| [ <table_index> ] }
[ ,... n ]
[ PERIOD FOR SYSTEM_TIME ( system_start_time_column_name
, system_end_time_column_name ) ]
)
[ ON { partition_scheme_name ( partition_column_name )
| filegroup
| "default" } ]
[ TEXTIMAGE_ON { filegroup | "default" } ]
[ FILESTREAM_ON { partition_scheme_name
| filegroup
| "default" } ]
[ WITH ( <table_option> [ ,... n ] ) ]
[ ; ]
<column_definition> ::=
column_name <data_type>
[ FILESTREAM ]
[ COLLATE collation_name ]
[ SPARSE ]
[ MASKED WITH ( FUNCTION = 'mask_function' ) ]
[ [ CONSTRAINT constraint_name ] DEFAULT constant_expression ]
[ IDENTITY [ ( seed , increment ) ] ]
[ NOT FOR REPLICATION ]
[ GENERATED ALWAYS AS { ROW | TRANSACTION_ID | SEQUENCE_NUMBER } { START | END } [ HIDDEN ] ]
[ [ CONSTRAINT constraint_name ] {NULL | NOT NULL} ]
[ ROWGUIDCOL ]
[ ENCRYPTED WITH
( COLUMN_ENCRYPTION_KEY = key_name ,
ENCRYPTION_TYPE = { DETERMINISTIC | RANDOMIZED } ,
ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256'
) ]
[ <column_constraint> [ ,... n ] ]
[ <column_index> ]
<data_type> ::=
[ type_schema_name. ] type_name
[ ( precision [ , scale ] | max |
[ { CONTENT | DOCUMENT } ] xml_schema_collection ) ]
<column_constraint> ::=
[ CONSTRAINT constraint_name ]
{
{ PRIMARY KEY | UNIQUE }
[ CLUSTERED | NONCLUSTERED ]
[ ( <column_name> [ ,... n ] ) ]
[
WITH FILLFACTOR = fillfactor
| WITH ( <index_option> [ ,... n ] )
]
[ ON { partition_scheme_name ( partition_column_name )
| filegroup | "default" } ]
| [ FOREIGN KEY ]
REFERENCES [ schema_name. ] referenced_table_name [ ( ref_column ) ]
[ ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]
[ ON UPDATE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]
[ NOT FOR REPLICATION ]
| CHECK [ NOT FOR REPLICATION ] ( logical_expression )
}
<column_index> ::=
INDEX index_name [ CLUSTERED | NONCLUSTERED ]
[ WITH ( <index_option> [ ,... n ] ) ]
[ ON { partition_scheme_name ( column_name )
| filegroup_name
| default
}
]
[ FILESTREAM_ON { filestream_filegroup_name | partition_scheme_name | "NULL" } ]
<computed_column_definition> ::=
column_name AS computed_column_expression
[ PERSISTED [ NOT NULL ] ]
[
[ CONSTRAINT constraint_name ]
{ PRIMARY KEY | UNIQUE }
[ CLUSTERED | NONCLUSTERED ]
[
WITH FILLFACTOR = fillfactor
| WITH ( <index_option> [ ,... n ] )
]
[ ON { partition_scheme_name ( partition_column_name )
| filegroup | "default" } ]
| [ FOREIGN KEY ]
REFERENCES referenced_table_name [ ( ref_column ) ]
[ ON DELETE { NO ACTION | CASCADE } ]
[ ON UPDATE { NO ACTION } ]
[ NOT FOR REPLICATION ]
| CHECK [ NOT FOR REPLICATION ] ( logical_expression )
]
<column_set_definition> ::=
column_set_name XML COLUMN_SET FOR ALL_SPARSE_COLUMNS
<table_constraint> ::=
[ CONSTRAINT constraint_name ]
{
{ PRIMARY KEY | UNIQUE }
[ CLUSTERED | NONCLUSTERED ]
( column_name [ ASC | DESC ] [ ,... n ] )
[
WITH FILLFACTOR = fillfactor
| WITH ( <index_option> [ ,... n ] )
]
[ ON { partition_scheme_name (partition_column_name)
| filegroup | "default" } ]
| FOREIGN KEY
( column_name [ ,... n ] )
REFERENCES referenced_table_name [ ( ref_column [ ,... n ] ) ]
[ ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]
[ ON UPDATE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]
[ NOT FOR REPLICATION ]
| CHECK [ NOT FOR REPLICATION ] ( logical_expression )
}
<table_index> ::=
{
{
INDEX index_name [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ]
( column_name [ ASC | DESC ] [ ,... n ] )
| INDEX index_name CLUSTERED COLUMNSTORE [ ORDER (column_name [ , ...n ] ) ]
| INDEX index_name [ NONCLUSTERED ] COLUMNSTORE ( column_name [ ,... n ] )
}
[ INCLUDE ( column_name [ ,... n ] ) ]
[ WHERE <filter_predicate> ]
[ WITH ( <index_option> [ ,... n ] ) ]
[ ON { partition_scheme_name ( column_name )
| filegroup_name
| default
}
]
[ FILESTREAM_ON { filestream_filegroup_name | partition_scheme_name | "NULL" } ]
}
<table_option> ::=
{
[ DATA_COMPRESSION = { NONE | ROW | PAGE }
[ ON PARTITIONS ( { <partition_number_expression> | <range> }
[ ,... n ] ) ] ]
[ XML_COMPRESSION = { ON | OFF }
[ ON PARTITIONS ( { <partition_number_expression> | <range> }
[ ,... n ] ) ] ]
[ FILETABLE_DIRECTORY = <directory_name> ]
[ FILETABLE_COLLATE_FILENAME = { <collation_name> | database_default } ]
[ FILETABLE_PRIMARY_KEY_CONSTRAINT_NAME = <constraint_name> ]
[ FILETABLE_STREAMID_UNIQUE_CONSTRAINT_NAME = <constraint_name> ]
[ FILETABLE_FULLPATH_UNIQUE_CONSTRAINT_NAME = <constraint_name> ]
[ SYSTEM_VERSIONING = ON
[ ( HISTORY_TABLE = schema_name.history_table_name
[ , DATA_CONSISTENCY_CHECK = { ON | OFF } ]
) ]
]
[ REMOTE_DATA_ARCHIVE =
{
ON [ ( <table_stretch_options> [ ,... n] ) ]
| OFF ( MIGRATION_STATE = PAUSED )
}
]
[ DATA_DELETION = ON
{ (
FILTER_COLUMN = column_name,
RETENTION_PERIOD = { INFINITE | number { DAY | DAYS | WEEK | WEEKS
| MONTH | MONTHS | YEAR | YEARS } }
) }
]
[ LEDGER = ON [ ( <ledger_option> [ ,... n ] ) ]
| OFF
]
}
<ledger_option>::=
{
[ LEDGER_VIEW = schema_name.ledger_view_name [ ( <ledger_view_option> [ ,... n ] ) ] ]
[ APPEND_ONLY = ON | OFF ]
}
<ledger_view_option>::=
{
[ TRANSACTION_ID_COLUMN_NAME = transaction_id_column_name ]
[ SEQUENCE_NUMBER_COLUMN_NAME = sequence_number_column_name ]
[ OPERATION_TYPE_COLUMN_NAME = operation_type_id column_name ]
[ OPERATION_TYPE_DESC_COLUMN_NAME = operation_type_desc_column_name ]
}
<table_stretch_options> ::=
{
[ FILTER_PREDICATE = { NULL | table_predicate_function } , ]
MIGRATION_STATE = { OUTBOUND | INBOUND | PAUSED }
}
<index_option> ::=
{
PAD_INDEX = { ON | OFF }
| FILLFACTOR = fillfactor
| IGNORE_DUP_KEY = { ON | OFF }
| STATISTICS_NORECOMPUTE = { ON | OFF }
| STATISTICS_INCREMENTAL = { ON | OFF }
| ALLOW_ROW_LOCKS = { ON | OFF }
| ALLOW_PAGE_LOCKS = { ON | OFF }
| OPTIMIZE_FOR_SEQUENTIAL_KEY = { ON | OFF }
| COMPRESSION_DELAY = { 0 | delay [ Minutes ] }
| DATA_COMPRESSION = { NONE | ROW | PAGE | COLUMNSTORE | COLUMNSTORE_ARCHIVE }
[ ON PARTITIONS ( { partition_number_expression | <range> }
[ ,... n ] ) ]
| XML_COMPRESSION = { ON | OFF }
[ ON PARTITIONS ( { <partition_number_expression> | <range> }
[ ,... n ] ) ]
}
<range> ::=
<partition_number_expression> TO <partition_number_expression>
Sintaxe para tabelas otimizadas para memória
Sintaxe CREATE TABLE otimizada para memória:
CREATE TABLE
{ database_name.schema_name.table_name | schema_name.table_name | table_name }
( { <column_definition>
| [ <table_constraint> ] [ ,... n ]
| [ <table_index> ]
[ ,... n ] }
[ PERIOD FOR SYSTEM_TIME ( system_start_time_column_name
, system_end_time_column_name ) ]
)
[ WITH ( <table_option> [ ,... n ] ) ]
[ ; ]
<column_definition> ::=
column_name <data_type>
[ COLLATE collation_name ]
[ GENERATED ALWAYS AS ROW { START | END } [ HIDDEN ] ]
[ NULL | NOT NULL ]
[ [ CONSTRAINT constraint_name ] DEFAULT memory_optimized_constant_expression ]
| [ IDENTITY [ ( 1, 1 ) ] ]
[ <column_constraint> ]
[ <column_index> ]
<data_type> ::=
[type_schema_name. ] type_name [ (precision [ , scale ]) ]
<column_constraint> ::=
[ CONSTRAINT constraint_name ]
{
{ PRIMARY KEY | UNIQUE }
{ NONCLUSTERED
| NONCLUSTERED HASH WITH ( BUCKET_COUNT = bucket_count )
}
[ ( <column_name> [ ,... n ] ) ]
| [ FOREIGN KEY ]
REFERENCES [ schema_name. ] referenced_table_name [ ( ref_column ) ]
| CHECK ( logical_expression )
}
<table_constraint> ::=
[ CONSTRAINT constraint_name ]
{
{ PRIMARY KEY | UNIQUE }
{
NONCLUSTERED ( column_name [ ASC | DESC ] [ ,... n ])
| NONCLUSTERED HASH ( column_name [ ,... n ] ) WITH ( BUCKET_COUNT = bucket_count )
}
| FOREIGN KEY
( column_name [ ,... n ] )
REFERENCES referenced_table_name [ ( ref_column [ ,... n ] ) ]
| CHECK ( logical_expression )
}
<column_index> ::=
INDEX index_name
{ [ NONCLUSTERED ] | [ NONCLUSTERED ] HASH WITH ( BUCKET_COUNT = bucket_count ) }
<table_index> ::=
INDEX index_name
{ [ NONCLUSTERED ] HASH ( column_name [ ,... n ] ) WITH ( BUCKET_COUNT = bucket_count )
| [ NONCLUSTERED ] ( column_name [ ASC | DESC ] [ ,... n ] )
[ ON filegroup_name | default ]
| CLUSTERED COLUMNSTORE [ WITH ( COMPRESSION_DELAY = { 0 | delay [ Minutes ] } ) ]
[ ON filegroup_name | default ]
}
<table_option> ::=
{
MEMORY_OPTIMIZED = ON
| DURABILITY = { SCHEMA_ONLY | SCHEMA_AND_DATA }
| SYSTEM_VERSIONING = ON [ ( HISTORY_TABLE = schema_name.history_table_name
[, DATA_CONSISTENCY_CHECK = { ON | OFF } ] ) ]
}
Argumentos
database_name
O nome do banco de dados no qual a tabela é criada. database_name deve especificar o nome de um banco de dados existente. Se não for especificado, database_name assume como padrão o banco de dados atual. O login para a conexão atual deve ser associado a um ID de usuário existente no banco de dados especificado por database_namee esse ID de usuário deve ter permissões CREATE TABLE.
schema_name
O nome do esquema ao qual a nova tabela pertence.
table_name
O nome da nova tabela. Os nomes das tabelas devem seguir as regras para identificadores.
table_name pode ter no máximo 128 caracteres, exceto para nomes de tabelas temporárias locais (nomes prefixados com um único sinal numérico (#
)) que não podem exceder 116 caracteres.
Tabela de arquivos AS
Aplica-se a: SQL Server 2012 (11.x) e posterior.
Cria a nova tabela como uma FileTable. Você não especifica colunas porque uma FileTable tem um esquema fixo. Para obter mais informações, consulte FileTables.
column_name COMO computed_column_expression
Uma expressão que define o valor de uma coluna calculada. Uma coluna computada é uma coluna virtual que não está fisicamente armazenada na tabela, a menos que a coluna esteja marcada como PERSISTENTE. A coluna é calculada a partir de uma expressão que usa outras colunas na mesma tabela. Por exemplo, uma coluna computada pode ter a definição: cost AS price * qty
. A expressão pode ser um nome de coluna não calculado, constante, função, variável e qualquer combinação destes conectados por um ou mais operadores. A expressão não pode ser uma subconsulta ou conter tipos de dados de alias.
As colunas computadas podem ser usadas em listas selecionadas, cláusulas WHERE, cláusulas ORDER BY ou quaisquer outros locais em que expressões regulares possam ser usadas, com as seguintes exceções:
As colunas computadas devem ser marcadas como PERSISTED para participar de uma restrição FOREIGN KEY ou CHECK.
Uma coluna computada pode ser usada como uma coluna de chave em um índice ou como parte de qualquer restrição de CHAVE PRIMÁRIA ou EXCLUSIVO, se o valor da coluna computada for definido por uma expressão determinística e o tipo de dados do resultado for permitido em colunas de índice.
Por exemplo, se a tabela tiver colunas inteiras
a
eb
, oa + b
de coluna computado pode ser indexado, mas oa + DATEPART(dd, GETDATE())
de coluna computado não pode ser indexado porque o valor pode mudar em invocações subsequentes.Uma coluna computada não pode ser o destino de uma instrução INSERT ou UPDATE.
Observação
Cada linha de uma tabela pode ter valores diferentes para colunas envolvidas em uma coluna calculada; portanto, a coluna computada pode não ter o mesmo valor para cada linha.
Com base nas expressões usadas, a anulabilidade das colunas computadas é determinada automaticamente pelo Mecanismo de Banco de Dados. O resultado da maioria das expressões é considerado anulável mesmo que apenas colunas não anuláveis estejam presentes, porque possíveis subfluxos ou estouros também produzem resultados NULL. Use a função COLUMNPROPERTY
com a propriedade AllowsNull para investigar a anulabilidade de qualquer coluna computada em uma tabela. Uma expressão que é anulável pode ser transformada em uma não anulável especificando ISNULL
com a constante check_expression, onde a constante é um valor não nulo substituído por qualquer resultado NULL. A permissão REFERENCES no tipo é necessária para colunas computadas com base em expressões de tipo definidas pelo usuário do Common Language Runtime (CLR).
PERSISTIU
Especifica que o Mecanismo de Banco de Dados do SQL Server armazenará fisicamente os valores computados na tabela e atualizará os valores quando quaisquer outras colunas das quais a coluna computada depende forem atualizadas. Marcar uma coluna computada como PERSISTED
permite criar um índice em uma coluna computada que é determinística, mas não precisa. Para obter mais informações, consulte índices em colunas computadas. Todas as colunas computadas usadas como colunas de particionamento de uma tabela particionada devem ser explicitamente marcadas PERSISTED
.
computed_column_expression deve ser determinística quando PERSISTED
é especificado.
ON { partition_scheme | filegroup | "padrão" }
Especifica o esquema de partição ou grupo de arquivos no qual a tabela está armazenada. Se partition_scheme for especificado, a tabela deve ser uma tabela particionada cujas partições são armazenadas em um conjunto de um ou mais grupos de arquivos especificados em partition_scheme. Se de grupo de arquivos for especificado, a tabela será armazenada no grupo de arquivos nomeado. O grupo de arquivos deve existir dentro do banco de dados. Se "default"
for especificado, ou se ON não for especificado, a tabela será armazenada no grupo de arquivos padrão. O mecanismo de armazenamento de uma tabela, conforme especificado em CREATE TABLE, não pode ser alterado posteriormente.
ON { partition_scheme | filegroup | "default" } também pode ser especificado em uma restrição PRIMARY KEY ou UNIQUE. Essas restrições criam índices. Se de grupo de arquivos for especificado, o índice será armazenado no grupo de arquivos nomeado. Se "default"
for especificado, ou se ON não for especificado, o índice será armazenado no mesmo grupo de arquivos que a tabela. Se a restrição PRIMARY KEY ou UNIQUE criar um índice clusterizado, as páginas de dados da tabela serão armazenadas no mesmo grupo de arquivos que o índice. Se CLUSTERED
for especificado ou se a restrição criar um índice clusterizado e for especificado um partition_scheme diferente do partition_scheme ou grupo de arquivos da definição de tabela, ou vice-versa, somente a definição de restrição será respeitada e a outra será ignorada.
Observação
Neste contexto, padrão não é uma palavra-chave. É um identificador para o grupo de arquivos padrão e deve ser delimitado, como em ON "default"
ou ON [default]
. Se "default"
for especificado, a opção QUOTED_IDENTIFIER
deverá estar ATIVADA para a sessão atual. Esta é a configuração padrão. Para obter mais informações, consulte SET QUOTED_IDENTIFIER.
Depois de criar uma tabela particionada, considere definir a opção LOCK_ESCALATION
para a tabela AUTO
. Isso pode melhorar a simultaneidade, permitindo que os bloqueios escalem para o nível de partição (HoBT) em vez da tabela. Para obter mais informações, consulte ALTER TABLE.
TEXTIMAGE_ON { filegroup | "padrão" }
Indica que o texto , ntext, image, xml, varchar(max), nvarchar(max), varbinary(max)e colunas de tipo definidas pelo usuário CLR (incluindo geometria e geografia) são armazenadas no grupo de arquivos especificado.
TEXTIMAGE_ON
não é permitido se não houver colunas de valor grande na tabela.
TEXTIMAGE_ON
não pode ser especificado se partition_scheme for especificado. Se "default"
for especificado, ou se TEXTIMAGE_ON
não for especificado, as colunas de valor grande serão armazenadas no grupo de arquivos padrão. O armazenamento de quaisquer dados de coluna de grande valor especificados em CREATE TABLE
não pode ser alterado posteriormente.
Observação
varchar(max), nvarchar(max), varbinary(max), xml e grandes valores UDT são armazenados diretamente na linha de dados, até um limite de 8.000 bytes, e desde que o valor possa caber no registro. Se o valor não couber no registro, um ponteiro será armazenado em linha e o restante será armazenado fora da linha no espaço de armazenamento LOB. 0 é o valor padrão, que indica que todos os valores são armazenados diretamente na linha de dados.
TEXTIMAGE_ON
apenas altera o local do "espaço de armazenamento LOB", isso não afeta quando os dados são armazenados em linha. Use a opção de tipos de valor grande fora da linha de sp_tableoption
para armazenar todo o valor LOB fora da linha.
Neste contexto, padrão não é uma palavra-chave. É um identificador para o grupo de arquivos padrão e deve ser delimitado, como em TEXTIMAGE_ON "default"
ou TEXTIMAGE_ON [default]
. Se "default"
for especificado, a opção QUOTED_IDENTIFIER
deverá estar ATIVADA para a sessão atual. Esta é a configuração padrão. Para obter mais informações, consulte SET QUOTED_IDENTIFIER.
FILESTREAM_ON { partition_scheme_name | filegroup | "padrão" }
Aplica-se a: SQL Server 2008 R2 (10.50.x) e posterior. A Base de Dados SQL do Azure e a Instância Gerida SQL do Azure não suportam FILESTREAM
.
Especifica o grupo de arquivos para dados FILESTREAM.
Se a tabela contiver dados FILESTREAM e a tabela for particionada, a cláusula FILESTREAM_ON deverá ser incluída e deverá especificar um esquema de partição de grupos de arquivos FILESTREAM. Este esquema de partição deve usar a mesma função de partição e colunas de partição que o esquema de partição para a tabela; caso contrário, um erro será gerado.
Se a tabela não estiver particionada, a coluna FILESTREAM não poderá ser particionada. Os dados FILESTREAM para a tabela devem ser armazenados em um único grupo de arquivos. Esse grupo de arquivos é especificado na cláusula FILESTREAM_ON.
Se a tabela não estiver particionada e a cláusula FILESTREAM_ON
não for especificada, o grupo de arquivos FILESTREAM que tem a propriedade DEFAULT
definida será usado. Se não houver nenhum grupo de arquivos FILESTREAM, um erro será gerado.
Tal como acontece com ON e TEXTIMAGE_ON
, o valor definido usando CREATE TABLE
para FILESTREAM_ON
não pode ser alterado, exceto nos seguintes casos:
- Uma instrução CREATE INDEX converte uma pilha em um índice clusterizado. Nesse caso, um grupo de arquivos FILESTREAM diferente, esquema de partição ou NULL pode ser especificado.
- Uma instrução DROP INDEX converte um índice clusterizado em um heap. Nesse caso, um grupo de arquivos, esquema de partição ou
"default"
FILESTREAM diferente pode ser especificado.
O grupo de arquivos na cláusula FILESTREAM_ON <filegroup>
, ou cada grupo de arquivos FILESTREAM nomeado no esquema de partição, deve ter um arquivo definido para o grupo de arquivos. Este arquivo deve ser definido usando uma CREATE DATABASE ou instrução ALTER DATABASE; caso contrário, um erro será gerado.
Para artigos FILESTREAM relacionados, consulte Binary Large Object - Blob Data.
[ type_schema_name. ] type_name
Especifica o tipo de dados da coluna e o esquema ao qual ela pertence. Para tabelas baseadas em disco, use um dos seguintes tipos de dados:
- Um tipo de dados do sistema
- Um tipo de alias baseado em um tipo de dados de sistema do SQL Server. Os tipos de dados de alias são criados com a instrução
CREATE TYPE
antes de poderem ser usados em uma definição de tabela. A atribuição NULL ou NOT NULL para um tipo de dados de alias pode ser substituída durante a instruçãoCREATE TABLE
. No entanto, a especificação de comprimento não pode ser alterada; O comprimento de um tipo de dados de alias não pode ser especificado em uma instruçãoCREATE TABLE
. - Um tipo CLR definido pelo usuário. Os tipos definidos pelo usuário CLR são criados com a instrução
CREATE TYPE
antes de poderem ser usados em uma definição de tabela. Para criar uma coluna no tipo definido pelo usuário CLR, a permissão REFERENCES é necessária no tipo.
Se type_schema_name não for especificado, as referências do Mecanismo de Banco de Dados do SQL Server type_name na seguinte ordem:
- O tipo de dados do sistema SQL Server.
- O esquema padrão do usuário atual no banco de dados atual.
- O esquema
dbo
no banco de dados atual.
Para tabelas com otimização de memória, consulte Supported Data Types for In-Memory OLTP para obter uma lista de tipos de sistema suportados.
precisão
A precisão para o tipo de dados especificado. Para obter mais informações sobre valores de precisão válidos, consulte Precision, Scale and Length.
escala
A escala para o tipo de dados especificado. Para obter mais informações sobre valores de escala válidos, consulte de precisão, escala e comprimento .
máximo
Aplica-se apenas aos varchar , nvarchare tipos de dados varbinary para armazenar 2^31 bytes de caracteres e dados binários e 2^30 bytes de dados Unicode.
CONTEÚDO
Especifica que cada instância do xml tipo de dados no column_name pode conter vários elementos de nível superior. CONTENT aplica-se apenas ao tipo de dados xml e só pode ser especificado se xml_schema_collection também for especificado. Se não for especificado, CONTENT é o comportamento padrão.
DOCUMENTO
Especifica que cada instância do tipo de dados xml no column_name pode conter apenas um elemento de nível superior. DOCUMENT aplica-se apenas ao tipo de dados xml e só pode ser especificado se xml_schema_collection também for especificado.
xml_schema_collection
Aplica-se somente ao tipo de dados xml para associar uma coleção de esquema XML ao tipo. Antes de digitar uma coluna de xml em um esquema, o esquema deve primeiro ser criado no banco de dados usando CREATE XML SCHEMA COLLECTION.
INADIMPLÊNCIA
Especifica o valor fornecido para a coluna quando um valor não é fornecido explicitamente durante uma inserção. As definições DEFAULT podem ser aplicadas a qualquer coluna, exceto aquelas definidas como de carimbo de data/hora ou aquelas com a propriedade IDENTITY
. Se um valor padrão for especificado para uma coluna de tipo definido pelo usuário, o tipo deverá oferecer suporte a uma conversão implícita de constant_expression para o tipo definido pelo usuário. As definições DEFAULT são removidas quando a tabela é descartada. Apenas um valor constante, como uma cadeia de caracteres; uma função escalar (uma função de sistema, definida pelo usuário ou CLR); ou NULL pode ser usado como padrão. Para manter a compatibilidade com versões anteriores do SQL Server, um nome de restrição pode ser atribuído a um DEFAULT.
constant_expression
Uma constante, NULL ou uma função do sistema que é usada como o valor padrão para a coluna.
memory_optimized_constant_expression
Uma constante, NULL ou uma função do sistema que é suportada em usado como o valor padrão para a coluna. Deve ser suportado em procedimentos armazenados compilados nativamente. Para obter mais informações sobre funções internas em procedimentos armazenados compilados nativamente, consulte recursos suportados para módulos T-SQL compilados nativamente.
IDENTIDADE
Indica que a nova coluna é uma coluna de identidade. Quando uma nova linha é adicionada à tabela, o Mecanismo de Banco de Dados fornece um valor incremental exclusivo para a coluna. As colunas de identidade são normalmente usadas com restrições de CHAVE PRIMÁRIA para servir como identificador de linha exclusivo para a tabela. A propriedade IDENTITY
pode ser atribuída a tinyint , smallint, int, bigint, decimal (p, 0)ou numérico (p, 0) colunas. Apenas uma coluna de identidade pode ser criada por tabela. Os padrões vinculados e as restrições DEFAULT não podem ser usados com uma coluna de identidade. Tanto a semente como o incremento ou nenhum deles devem ser especificados. Se nenhum dos dois for especificado, o padrão será (1,1).
sementes
O valor usado para a primeira linha carregada na tabela.
incremento
O valor incremental adicionado ao valor de identidade da linha anterior carregada.
NÃO SE DESTINA À REPLICAÇÃO
Na instrução CREATE TABLE
, a cláusula NOT FOR REPLICATION
pode ser especificada para a propriedade IDENTITY, restrições FOREIGN KEY e restrições CHECK. Se essa cláusula for especificada para a propriedade IDENTITY
, os valores não serão incrementados nas colunas de identidade quando os agentes de replicação executarem inserções. Se essa cláusula for especificada para uma restrição, ela não será imposta quando os agentes de replicação executarem operações de inserção, atualização ou exclusão.
GERADO SEMPRE COMO { LINHA | TRANSACTION_ID | SEQUENCE_NUMBER } { INICIAR | FIM } [ OCULTO ] [ NÃO NULO ]
Aplica-se a: SQL Server 2016 (13.x) e posterior, Banco de Dados SQL do Azure e Instância Gerenciada SQL do Azure.
Especifica uma coluna usada pelo sistema para registrar automaticamente informações sobre versões de linha na tabela e sua tabela de histórico (se a tabela tiver o controle de versão do sistema e tiver uma tabela de histórico). Use esse argumento com o parâmetro WITH SYSTEM_VERSIONING = ON
para criar tabelas com versão do sistema: tabelas temporais ou contábeis. Para obter mais informações, consulte tabelas contábeis atualizáveis e tabelas temporais.
Parâmetro | Tipo de dados obrigatório | Anulabilidade necessária | Descrição |
---|---|---|---|
LINHA | datetime2 | INÍCIO: NOT NULL FIM: NOT NULL |
A hora de início para a qual uma versão de linha é válida (START) ou a hora de término para a qual uma versão de linha é válida (END). Use esse argumento com o argumento PERIOD FOR SYSTEM_TIME para criar uma tabela temporal. |
TRANSACTION_ID | bigint | INÍCIO: NOT NULL FIM: NULL |
Aplica-se a: SQL Server 2022 (16.x) e posterior e Banco de Dados SQL do Azure. A ID da transação que cria (START) ou invalida (END) uma versão de linha. Se a tabela for uma tabela contábil, o ID fará referência a uma linha na visualização sys.database_ledger_transactions |
SEQUENCE_NUMBER | bigint | INÍCIO: NOT NULL FIM: NULL |
Aplica-se a: SQL Server 2022 (16.x) e posterior e Banco de Dados SQL do Azure. O número de sequência de uma operação que cria (START) ou exclui (END) uma versão de linha. Este valor é único dentro da transação. |
Se você tentar especificar uma coluna que não atenda ao tipo de dados acima ou aos requisitos de anulabilidade, o sistema lançará um erro. Se você não especificar explicitamente a anulabilidade, o sistema definirá a coluna como NULL
ou NOT NULL
de acordo com os requisitos acima.
Você pode marcar uma ou ambas as colunas de período com HIDDEN
sinalizador para ocultar implicitamente essas colunas de modo que SELECT * FROM <table>
não retorne um valor para essas colunas. Por padrão, as colunas de ponto não ficam ocultas. Para serem usadas, as colunas ocultas devem ser explicitamente incluídas em todas as consultas que fazem referência direta à tabela temporal. Para alterar o atributo HIDDEN
de uma coluna de período existente, PERIOD
deve ser descartada e recriada com um sinalizador oculto diferente.
ÍNDICE index_name [ AGRUPADO | NÃO AGRUPADO ] ( column_name [ ASC | DESC ] [ ,... n ] )
Aplica-se a: SQL Server 2014 (12.x) e posterior e Banco de Dados SQL do Azure.
Especifica para criar um índice na tabela. Pode ser um índice clusterizado ou um índice não clusterizado. O índice conterá as colunas listadas e classificará os dados em ordem crescente ou decrescente.
ÍNDICE index_name COLUMNSTORE CLUSTERIZADO
Aplica-se a: SQL Server 2014 (12.x) e posterior e Banco de Dados SQL do Azure.
Especifica para armazenar a tabela inteira em formato colunar com um índice columnstore clusterizado. Isso sempre inclui todas as colunas na tabela. Os dados não são classificados em ordem alfabética ou numérica, pois as linhas são organizadas para obter benefícios de compactação columnstore.
Você pode especificar uma ordem para os dados em um índice columnstore clusterizado começando com o SQL Server 2022 (16.x), no Banco de Dados SQL do Azure, na Instância Gerenciada SQL do Azure com a política de atualização up-toe no Azure Synapse Analytics. Para obter mais informações, consulte Ajuste de desempenho com índices columnstore ordenados.
ÍNDICE index_name [ NÃO AGRUPADO ] COLUMNSTORE ( column_name [ ,... n ] )
Aplica-se a: SQL Server 2014 (12.x) e versões posteriores, Banco de Dados SQL do Azure e Instância Gerenciada SQL do Azure.
Especifica para criar um índice columnstore não clusterizado na tabela. A tabela subjacente pode ser um heap rowstore ou um índice clusterizado, ou pode ser um índice columnstore clusterizado. Em todos os casos, a criação de um índice columnstore não clusterizado em uma tabela armazena uma segunda cópia dos dados para as colunas no índice.
O índice columnstore não clusterizado é armazenado e gerenciado como um índice columnstore clusterizado. É chamado de índice columnstore não clusterizado porque as colunas podem ser limitadas e existe como um índice secundário em uma tabela.
Você pode especificar uma ordem para os dados em um índice columnstore não clusterizado no Banco de Dados SQL do Azure e na Instância Gerenciada SQL do Azure com a política de atualização Always-up-to-date. Para obter mais informações, consulte Ajuste de desempenho com índices columnstore ordenados.
EM partition_scheme_name ( column_name )
Especifica o esquema de partição que define os grupos de arquivos nos quais as partições de um índice particionado serão mapeadas. O esquema de partição deve existir dentro do banco de dados executando CREATE PARTITION SCHEME ou ALTER PARTITION SCHEME. column_name especifica a coluna em relação à qual um índice particionado será particionado. Esta coluna deve corresponder ao tipo de dados, comprimento e precisão do argumento da função de partição que partition_scheme_name está usando. column_name não se restringe às colunas na definição de índice. Qualquer coluna na tabela base pode ser especificada, exceto ao particionar um índice UNIQUE, column_name deve ser escolhida entre as usadas como chave exclusiva. Essa restrição permite que o Mecanismo de Banco de Dados verifique a exclusividade dos valores de chave apenas em uma única partição.
Observação
Quando você particiona um índice clusterizado não exclusivo, o Mecanismo de Banco de Dados, por padrão, adiciona a coluna de particionamento à lista de chaves de índice clusterizadas, se ainda não estiver especificado. Ao particionar um índice não exclusivo e não clusterizado, o Mecanismo de Banco de Dados adiciona a coluna de particionamento como uma coluna não-chave (incluída) do índice, se ainda não estiver especificado.
Se partition_scheme_name ou de grupo de arquivos não for especificado e a tabela for particionada, o índice será colocado no mesmo esquema de partição, usando a mesma coluna de particionamento, que a tabela subjacente.
Observação
Não é possível especificar um esquema de particionamento em um índice XML. Se a tabela base for particionada, o índice XML usará o mesmo esquema de partição que a tabela.
Para obter mais informações sobre particionamento de índices, Tabelas e índices particionados.
EM filegroup_name
Cria o índice especificado no grupo de arquivos especificado. Se nenhum local for especificado e a tabela ou exibição não estiver particionada, o índice usará o mesmo grupo de arquivos que a tabela ou exibição subjacente. O grupo de arquivos já deve existir.
ON "padrão"
Cria o índice especificado no grupo de arquivos padrão.
Observação
Neste contexto, padrão não é uma palavra-chave. É um identificador para o grupo de arquivos padrão e deve ser delimitado, como em ON "default"
ou ON [default]
. Se "default"
for especificado, a opção QUOTED_IDENTIFIER
deverá estar ATIVADA para a sessão atual. Esta é a configuração padrão. Para obter mais informações, consulte SET QUOTED_IDENTIFIER.
[ FILESTREAM_ON { filestream_filegroup_name | partition_scheme_name | "NUL" } ]
Aplica-se a: SQL Server 2008 R2 (10.50.x) e posterior.
Especifica o posicionamento dos dados FILESTREAM para a tabela quando um índice clusterizado é criado. A cláusula FILESTREAM_ON permite que os dados FILESTREAM sejam movidos para um grupo de arquivos FILESTREAM ou esquema de partição diferente.
filestream_filegroup_name é o nome de um grupo de arquivos FILESTREAM. O grupo de arquivos deve ter um arquivo definido para o grupo de arquivos usando uma CREATE DATABASE ou instrução ALTER DATABASE; caso contrário, um erro será gerado.
Se a tabela for particionada, a cláusula FILESTREAM_ON
deverá ser incluída e deverá especificar um esquema de partição de grupos de arquivos FILESTREAM que use a mesma função de partição e colunas de partição que o esquema de partição para a tabela. Caso contrário, um erro será gerado.
Se a tabela não estiver particionada, a coluna FILESTREAM não poderá ser particionada. Os dados FILESTREAM para a tabela devem ser armazenados em um único grupo de arquivos especificado na cláusula FILESTREAM_ON
.
FILESTREAM_ON NULL
pode ser especificado em uma instrução CREATE INDEX
se um índice clusterizado estiver sendo criado e a tabela não contiver uma coluna FILESTREAM.
Para obter mais informações, consulte FILESTREAM.
ROWGUIDCOL
Indica que a nova coluna é uma coluna GUID de linha. Apenas um identificador exclusivo coluna por tabela pode ser designado como coluna ROWGUIDCOL. A aplicação da propriedade ROWGUIDCOL permite que a coluna seja referenciada usando $ROWGUID
. A propriedade ROWGUIDCOL pode ser atribuída somente a uma coluna uniqueidentifier. As colunas de tipo de dados definidas pelo usuário não podem ser designadas com ROWGUIDCOL.
A propriedade ROWGUIDCOL não impõe exclusividade dos valores armazenados na coluna. ROWGUIDCOL também não gera automaticamente valores para novas linhas inseridas na tabela. Para gerar valores exclusivos para cada coluna, use a NEWID ou função NEWSEQUENTIALID em instruções INSERT ou use essas funções como padrão para a coluna.
CRIPTOGRAFADO COM
Especifica colunas de criptografia usando o recurso Always Encrypted.
COLUMN_ENCRYPTION_KEY = key_name
Especifica a chave de criptografia da coluna. Para obter mais informações, consulte CREATE COLUMN ENCRYPTION KEY.
ENCRYPTION_TYPE = { DETERMINÍSTICA | ALEATORIZADO }
de criptografia determinística usa um método que sempre gera o mesmo valor criptografado para qualquer valor de texto sem formatação. O uso da criptografia determinística permite pesquisar usando comparação de igualdade, agrupamento e junção de tabelas usando junções de igualdade com base em valores criptografados, mas também pode permitir que usuários não autorizados adivinhem informações sobre valores criptografados examinando padrões na coluna criptografada. A junção de duas tabelas em colunas criptografadas deterministicamente só é possível se ambas as colunas forem criptografadas usando a mesma chave de criptografia de coluna. A criptografia determinística deve usar um agrupamento de colunas com uma ordem de classificação binary2 para colunas de caracteres.
de criptografia aleatória usa um método que criptografa dados de maneira menos previsível. A criptografia aleatória é mais segura, mas impede quaisquer cálculos e indexação em colunas criptografadas, a menos que sua instância do SQL Server ofereça suporte a Always Encrypted com enclaves seguros. Consulte Always Encrypted with secure enclaves para obter detalhes.
Se você estiver usando Always Encrypted (sem enclaves seguros), use criptografia determinística para colunas que serão pesquisadas com parâmetros ou parâmetros de agrupamento, por exemplo, um número de ID do governo. Use criptografia aleatória para dados como um número de cartão de crédito, que não é agrupado com outros registros ou usado para unir tabelas e que não é pesquisado porque você usa outras colunas (como um número de transação) para encontrar a linha que contém a coluna criptografada de interesse.
Se você estiver usando Always Encrypted com enclaves seguros, a criptografia aleatória é um tipo de criptografia recomendado.
As colunas devem ser de um tipo de dados qualificado.
ALGORITMO
Aplica-se a: SQL Server 2016 (13.x) e posterior.
Deve ser
'AEAD_AES_256_CBC_HMAC_SHA_256'
.Para obter mais informações, incluindo restrições de recursos, consulte Always Encrypted.
ESPARSO
Indica que a coluna é uma coluna esparsa. O armazenamento de colunas esparsas é otimizado para valores nulos. Colunas esparsas não podem ser designadas como NÃO NULA. Para obter restrições adicionais e mais informações sobre colunas esparsas, consulte Usar colunas esparsas.
MASCARADO COM ( FUNÇÃO = 'mask_function' )
Aplica-se a: SQL Server 2016 (13.x) e posterior.
Especifica uma máscara de dados dinâmica. mask_function é o nome da função de mascaramento com os parâmetros apropriados. Quatro funções estão disponíveis:
default()
email()
partial()
random()
Requer permissão ALTER ANY MASK
.
Para parâmetros de função, consulte Dynamic Data Masking.
FLUXO DE ARQUIVOS
Aplica-se a: SQL Server 2008 R2 (10.50.x) e posterior.
Válido apenas para colunas de varbinary(max). Especifica o armazenamento FILESTREAM para os dados varbinary(max) BLOB.
A tabela também deve ter uma coluna do uniqueidentifier tipo de dados que tenha o atributo ROWGUIDCOL. Esta coluna não deve permitir valores nulos e deve ter uma restrição de coluna única UNIQUE ou PRIMARY KEY. O valor GUID para a coluna deve ser fornecido por um aplicativo ao inserir dados ou por uma restrição DEFAULT que usa a função NEWID ().
A coluna ROWGUIDCOL não pode ser descartada e as restrições relacionadas não podem ser alteradas enquanto houver uma coluna FILESTREAM definida para a tabela. A coluna ROWGUIDCOL só pode ser descartada depois que a última coluna FILESTREAM for descartada.
Quando o atributo de armazenamento FILESTREAM é especificado para uma coluna, todos os valores para essa coluna são armazenados em um contêiner de dados FILESTREAM no sistema de arquivos.
COLLATE collation_name
Especifica o agrupamento para a coluna. O nome do agrupamento pode ser um nome de agrupamento do Windows ou um nome de agrupamento SQL. collation_name é aplicável apenas para colunas do char, varchar, text, nchar, nvarchare ntext tipos de dados. Se não for especificado, será atribuído à coluna o agrupamento do tipo de dados definido pelo usuário, se a coluna for de um tipo de dados definido pelo usuário, ou o agrupamento padrão do banco de dados.
Para obter mais informações sobre os nomes de agrupamento Windows e SQL, consulte de Nome de agrupamento do Windows e Nome de agrupamento SQL.
Para obter mais informações, consulte COLLATE.
RESTRIÇÃO
Uma palavra-chave opcional que indica o início da definição de uma restrição PRIMARY KEY, NOT NULL, UNIQUE, FOREIGN KEY ou CHECK.
constraint_name
O nome de uma restrição. Os nomes de restrição devem ser exclusivos dentro do esquema ao qual a tabela pertence.
NULO | NÃO NULO
Determine se valores nulos são permitidos na coluna. NULL não é estritamente uma restrição, mas pode ser especificado assim como NOT NULL. NOT NULL pode ser especificado para colunas computadas somente se PERSISTED também for especificado.
CHAVE PRIMÁRIA
Uma restrição que impõe a integridade da entidade para uma coluna ou colunas especificadas por meio de um índice exclusivo. Apenas uma restrição de CHAVE PRIMÁRIA pode ser criada por tabela.
ÚNICO
Uma restrição que fornece integridade de entidade para uma coluna ou colunas especificadas por meio de um índice exclusivo. Uma tabela pode ter várias restrições EXCLUSIVAS.
AGRUPADOS | NÃO AGRUPADO
Indica que um índice clusterizado ou não clusterizado é criado para a restrição PRIMARY KEY ou UNIQUE. Restrições de CHAVE PRIMÁRIA padrão para CLUSTERED e restrições UNIQUE padrão para NONCLUSTERED.
Em uma instrução
CREATE TABLE
, CLUSTERED pode ser especificado para apenas uma restrição. Se CLUSTERED for especificado para uma restrição UNIQUE e uma restrição PRIMARY KEY também for especificada, o padrão PRIMARY KEY será NONCLUSTERED.REFERÊNCIAS CHAVE ESTRANGEIRAS
Uma restrição que fornece integridade referencial para os dados na coluna ou colunas. As restrições de CHAVE ESTRANGEIRA exigem que cada valor na coluna exista na coluna ou colunas referenciadas correspondentes na tabela referenciada. As restrições de CHAVE ESTRANGEIRA podem fazer referência apenas a colunas que são restrições de CHAVE PRIMÁRIA ou EXCLUSIVA na tabela referenciada ou colunas referenciadas em um ÍNDICE EXCLUSIVO na tabela referenciada. As chaves estrangeiras em colunas computadas também devem ser marcadas como PERSISTED.
[ [ schema_name. ] referenced_table_name ]
O nome da tabela referenciada pela restrição FOREIGN KEY e o esquema ao qual ela pertence.
( ref_column [ ,... n ] )
Uma coluna, ou lista de colunas, da tabela referenciada pela restrição FOREIGN KEY.
EM EXCLUIR { NENHUMA AÇÃO | CASCATA | DEFINIR NULO | DEFINIR PADRÃO }
Especifica qual ação acontece com as linhas na tabela criada, se essas linhas tiverem uma relação referencial e a linha referenciada for excluída da tabela pai. O padrão é NO ACTION.
SEM AÇÃO
O Mecanismo de Banco de Dados gera um erro e a ação de exclusão na linha da tabela pai é revertida.
CASCATA
As linhas correspondentes são excluídas da tabela de referência se essa linha for excluída da tabela pai.
SET NULL
Todos os valores que compõem a chave estrangeira são definidos como NULL se a linha correspondente na tabela pai for excluída. Para que essa restrição seja executada, as colunas de chave estrangeira devem ser anuláveis.
DEFINIR PADRÃO
Todos os valores que compõem a chave estrangeira são definidos como seus valores padrão quando a linha correspondente na tabela pai é excluída. Para que essa restrição seja executada, todas as colunas de chave estrangeira devem ter definições padrão. Se uma coluna for anulável e não houver nenhum valor padrão explícito definido, NULL se tornará o valor padrão implícito da coluna.
Não especifique
CASCADE
se a tabela será incluída em uma publicação de mesclagem que usa registros lógicos. Para obter mais informações sobre registros lógicos, consulte Alterações de grupo em linhas relacionadas com registros lógicos.ON DELETE CASCADE
não pode ser definido se já existe umON DELETE
de gatilho deINSTEAD OF
na mesa.Por exemplo, no banco de dados
AdventureWorks2022
, a tabelaProductVendor
tem uma relação referencial com a tabelaVendor
. A chave estrangeiraProductVendor.BusinessEntityID
faz referência à chave primáriaVendor.BusinessEntityID
.Se uma instrução
DELETE
for executada em uma linha na tabelaVendor
e uma açãoON DELETE CASCADE
for especificada paraProductVendor.BusinessEntityID
, o Mecanismo de Banco de Dados verificará se há uma ou mais linhas dependentes na tabelaProductVendor
. Se existirem, as linhas dependentes na tabelaProductVendor
são excluídas e também a linha referenciada na tabelaVendor
.Por outro lado, se
NO ACTION
for especificado, o Mecanismo de Banco de Dados gerará um erro e reverterá a ação de exclusão na linhaVendor
se houver pelo menos uma linha na tabelaProductVendor
que faça referência a ela.ON UPDATE { NENHUMA AÇÃO | CASCATA | DEFINIR NULO | DEFINIR PADRÃO }
Especifica qual ação acontece com as linhas na tabela alteradas quando essas linhas têm uma relação referencial e a linha referenciada é atualizada na tabela pai. O padrão é NO ACTION.
SEM AÇÃO
O Mecanismo de Banco de Dados gera um erro e a ação de atualização na linha da tabela pai é revertida.
CASCATA
As linhas correspondentes são atualizadas na tabela de referência quando essa linha é atualizada na tabela pai.
SET NULL
Todos os valores que compõem a chave estrangeira são definidos como NULL quando a linha correspondente na tabela pai é atualizada. Para que essa restrição seja executada, as colunas de chave estrangeira devem ser anuláveis.
DEFINIR PADRÃO
Todos os valores que compõem a chave estrangeira são definidos como seus valores padrão quando a linha correspondente na tabela pai é atualizada. Para que essa restrição seja executada, todas as colunas de chave estrangeira devem ter definições padrão. Se uma coluna for anulável e não houver nenhum valor padrão explícito definido, NULL se tornará o valor padrão implícito da coluna.
Não especifique
CASCADE
se a tabela será incluída em uma publicação de mesclagem que usa registros lógicos. Para obter mais informações sobre registros lógicos, consulte Alterações de grupo em linhas relacionadas com registros lógicos.ON UPDATE CASCADE
,SET NULL
ouSET DEFAULT
não podem ser definidos se já existir um gatilho deINSTEAD OF
ON UPDATE
na tabela que está sendo alterado.Por exemplo, no banco de dados
AdventureWorks2022
, a tabelaProductVendor
tem uma relação referencial com a tabelaVendor
:ProductVendor.BusinessEntity
chave estrangeira faz referência à chave primáriaVendor.BusinessEntityID
.Se uma instrução UPDATE for executada em uma linha na tabela
Vendor
e uma ação ON UPDATE CASCADE for especificada paraProductVendor.BusinessEntityID
, o Mecanismo de Banco de Dados verificará se há uma ou mais linhas dependentes na tabelaProductVendor
. Se existirem, as linhas dependentes na tabelaProductVendor
são atualizadas e também a linha referenciada na tabelaVendor
.Por outro lado, se NO ACTION for especificado, o Mecanismo de Banco de Dados gerará um erro e reverterá a ação de atualização na linha
Vendor
se houver pelo menos uma linha na tabelaProductVendor
que faça referência a ela.VERIFICAR
Uma restrição que impõe a integridade do domínio limitando os valores possíveis que podem ser inseridos em uma coluna ou colunas. As restrições CHECK em colunas computadas também devem ser marcadas como PERSISTED.
logical_expression
Uma expressão lógica que retorna TRUE ou FALSE. Os tipos de dados de alias não podem fazer parte da expressão.
column_name
Uma coluna ou lista de colunas, entre parênteses, usada em restrições de tabela para indicar as colunas usadas na definição de restrição.
[ ASC | DESC ]
Especifica a ordem na qual a coluna ou colunas que participam das restrições de tabela são classificadas. O padrão é ASC.
partition_scheme_name
O nome do esquema de partição que define os grupos de arquivos nos quais as partições de uma tabela particionada serão mapeadas. O esquema de partição deve existir dentro do banco de dados.
[ partition_column_name. ]
Especifica a coluna em relação à qual uma tabela particionada será particionada. A coluna deve corresponder à especificada na função de partição que partition_scheme_name está usando em termos de tipo de dados, comprimento e precisão. Uma coluna computada que participa de uma função de partição deve ser explicitamente marcada como PERSISTED.
Importante
Recomendamos que você especifique NOT NULL na coluna de particionamento de tabelas particionadas e também tabelas não particionadas que são fontes ou destinos de ALTER TABLE... Operações SWITCH. Isso garante que quaisquer restrições CHECK em colunas de particionamento não precisem verificar valores nulos.
COM FILLFACTOR = fillfactor
Especifica o quão completo o Mecanismo de Banco de Dados deve tornar cada página de índice usada para armazenar os dados de índice. Os valores de de fator de preenchimento especificados pelo usuário podem ser de 1 a 100. Se um valor não for especificado, o padrão será 0. Os valores de fator de preenchimento 0 e 100 são os mesmos em todos os aspetos.
Importante
Documentar WITH FILLFACTOR = fillfactor como a única opção de índice que se aplica a restrições PRIMARY KEY ou UNIQUE é mantido para compatibilidade com versões anteriores, mas não será documentado dessa maneira em versões futuras.
column_set_name COLUMN_SET XML PARA ALL_SPARSE_COLUMNS
O nome do conjunto de colunas. Um conjunto de colunas é uma representação XML sem tipo que combina todas as colunas esparsas de uma tabela em uma saída estruturada. Para obter mais informações sobre conjuntos de colunas, consulte Usar conjuntos de colunas.
PERÍODO PARA SYSTEM_TIME ( system_start_time_column_name , system_end_time_column_name )
Aplica-se a: SQL Server 2016 (13.x) e posterior e Banco de Dados SQL do Azure.
Especifica os nomes das colunas que o sistema usará para registrar o período para o qual um registro é válido. Use esse argumento com os argumentos GENERATED ALWAYS AS ROW { START | END }
e WITH SYSTEM_VERSIONING = ON
para criar uma tabela temporal. Para obter mais informações, consulte Tabelas temporais.
COMPRESSION_DELAY
Aplica-se a: SQL Server 2016 (13.x) e posterior e Banco de Dados SQL do Azure.
Para uma memória otimizada, delay especifica o número mínimo de minutos que uma linha deve permanecer na tabela, inalterada, antes de ser qualificada para compactação no índice columnstore. O SQL Server seleciona linhas específicas para compactar de acordo com a hora da última atualização. Por exemplo, se as linhas forem alteradas com frequência durante um período de duas horas, você poderá definir COMPRESSION_DELAY = 120 Minutes
para garantir que as atualizações sejam concluídas antes que o SQL Server compacte a linha.
Para uma tabela baseada em disco, delay especifica o número mínimo de minutos que um grupo de linhas delta no estado CLOSED deve permanecer no grupo de linhas delta antes que o SQL Server possa compactá-lo no grupo de linhas compactado. Como as tabelas baseadas em disco não controlam os tempos de inserção e atualização em linhas individuais, o SQL Server aplica o atraso a grupos de linhas delta no estado FECHADO.
O padrão é 0 minutos.
Para obter recomendações sobre quando usar COMPRESSION_DELAY
, consulte Introdução ao Columnstore para análise operacional em tempo real
<table_option> ::=
Especifica uma ou mais opções de tabela.
DATA_COMPRESSION
Especifica a opção de compactação de dados para a tabela especificada, o número da partição ou o intervalo de partições. As opções são as seguintes:
NENHUM
As partições de tabela ou especificadas não são compactadas.
LINHA
As partições de tabela ou especificadas são compactadas usando a compactação de linha.
PÁGINA
As partições de tabela ou especificadas são compactadas usando a compactação de página.
COLUMNSTORE
Aplica-se a: SQL Server 2016 (13.x) e posterior e Banco de Dados SQL do Azure.
Aplica-se somente a índices columnstore, incluindo índices columnstore não clusterizados e columnstore clusterizados. COLUMNSTORE especifica para compactar com a compactação columnstore de maior desempenho. Esta é a escolha típica.
COLUMNSTORE_ARCHIVE
Aplica-se a: SQL Server 2016 (13.x) e posterior e Banco de Dados SQL do Azure.
Aplica-se somente a índices columnstore, incluindo índices columnstore não clusterizados e columnstore clusterizados. COLUMNSTORE_ARCHIVE irá comprimir ainda mais a tabela ou partição para um tamanho menor. Isso pode ser usado para arquivamento ou para outras situações que exigem um tamanho de armazenamento menor e podem dar mais tempo para armazenamento e recuperação.
Para obter mais informações, consulte de compactação de dados .
XML_COMPRESSION
Aplica-se a: SQL Server 2022 (16.x) e versões posteriores, Banco de Dados SQL do Azure e Instância Gerenciada SQL do Azure.
Especifica a opção de compactação XML para qualquer colunas de tipo de dados xml na tabela. As opções são as seguintes:
EM
As colunas que usam o tipo de dados xml são compactadas.
DESLIGADO
As colunas que usam o tipo de dados xml não são compactadas.
EM PARTIÇÕES ( { <partition_number_expression> | [ ,... n ] )
Especifica as partições às quais as configurações de DATA_COMPRESSION
ou XML_COMPRESSION
se aplicam. Se a tabela não estiver particionada, o argumento ON PARTITIONS
gerará um erro. Se a cláusula ON PARTITIONS
não for fornecida, a opção DATA_COMPRESSION
será aplicada a todas as partições de uma tabela particionada.
partition_number_expression podem ser especificados das seguintes formas:
- Forneça o número da partição de uma partição, por exemplo:
ON PARTITIONS (2)
- Forneça os números de partição para várias partições individuais separadas por vírgulas, por exemplo:
ON PARTITIONS (1, 5)
- Forneça intervalos e partições individuais, por exemplo:
ON PARTITIONS (2, 4, 6 TO 8)
<range>
podem ser especificados como números de partição separados pela palavra TO, por exemplo: ON PARTITIONS (6 TO 8)
.
Para definir diferentes tipos de compactação de dados para partições diferentes, especifique a opção DATA_COMPRESSION
mais de uma vez, por exemplo:
WITH
(
DATA_COMPRESSION = NONE ON PARTITIONS (1),
DATA_COMPRESSION = ROW ON PARTITIONS (2, 4, 6 TO 8),
DATA_COMPRESSION = PAGE ON PARTITIONS (3, 5)
);
Você também pode especificar a opção XML_COMPRESSION
mais de uma vez, por exemplo:
WITH
(
XML_COMPRESSION = OFF ON PARTITIONS (1),
XML_COMPRESSION = ON ON PARTITIONS (2, 4, 6 TO 8),
XML_COMPRESSION = OFF ON PARTITIONS (3, 5)
);
<index_option> ::=
Especifica uma ou mais opções de índice. Para obter uma descrição completa dessas opções, consulte CREATE INDEX.
PAD_INDEX = { EM | DESLIGADO }
Quando ON, a porcentagem de espaço livre especificada por FILLFACTOR é aplicada às páginas de nível intermediário do índice. Quando OFF ou um valor FILLFACTOR não é especificado, as páginas de nível intermediário são preenchidas para perto da capacidade, deixando espaço suficiente para pelo menos uma linha do tamanho máximo que o índice pode ter, considerando o conjunto de chaves nas páginas intermediárias. O padrão é OFF.
FILLFACTOR = fillfactor
Especifica uma porcentagem que indica o quão cheio o Mecanismo de Banco de Dados deve tornar o nível de folha de cada página de índice durante a criação ou alteração do índice. de fator de preenchimento deve ser um valor inteiro de 1 a 100. O padrão é 0. Os valores de fator de preenchimento 0 e 100 são os mesmos em todos os aspetos.
IGNORE_DUP_KEY = { EM | DESLIGADO }
Especifica a resposta de erro quando uma operação de inserção tenta inserir valores de chave duplicados em um índice exclusivo. A opção IGNORE_DUP_KEY aplica-se apenas a operações de inserção depois que o índice é criado ou reconstruído. A opção não tem efeito ao executar CREATE INDEX, ALTER INDEXou UPDATE. O padrão é OFF.
EM
Uma mensagem de aviso ocorrerá quando valores de chave duplicados forem inseridos em um índice exclusivo. Somente as linhas que violarem a restrição de exclusividade falharão.
DESLIGADO
Uma mensagem de erro ocorrerá quando valores de chave duplicados forem inseridos em um índice exclusivo. Toda a operação INSERT será revertida.
IGNORE_DUP_KEY
não pode ser definido como ATIVADO para índices criados em uma exibição, índices não exclusivos, índices XML, índices espaciais e índices filtrados.
Para exibir IGNORE_DUP_KEY
, use sys.indexes.
Na sintaxe compatível com versões anteriores, WITH IGNORE_DUP_KEY
é equivalente a WITH IGNORE_DUP_KEY = ON
.
STATISTICS_NORECOMPUTE = { LIGADO | DESLIGADO }
Quando ATIVADO, as estatísticas de índice desatualizadas não são recalculadas automaticamente. Quando OFF, a atualização automática de estatísticas é ativada. O padrão é OFF.
ALLOW_ROW_LOCKS = { EM | DESLIGADO }
Quando ATIVADO, os bloqueios de linha são permitidos quando você acessa o índice. O Mecanismo de Banco de Dados determina quando os bloqueios de linha são usados. Quando OFF, os bloqueios de linha não são usados. O padrão é ON.
ALLOW_PAGE_LOCKS = { EM | DESLIGADO }
Quando ATIVADO, os bloqueios de página são permitidos quando você acessa o índice. O Mecanismo de Banco de Dados determina quando os bloqueios de página são usados. Quando OFF, os bloqueios de página não são usados. O padrão é ON.
OTIMIZE_FOR_SEQUENTIAL_KEY = { EM | DESLIGADO }
Aplica-se a: SQL Server 2019 (15.x) e posterior, Banco de Dados SQL do Azure e Instância Gerenciada SQL do Azure.
Especifica se a contenção de inserção da última página deve ou não ser otimizada. O padrão é OFF. Consulte a seção chaves sequenciais da página CREATE INDEX para obter mais informações.
FILETABLE_DIRECTORY = directory_name
Aplica-se a: SQL Server 2012 (11.x) e posterior.
Especifica o nome do diretório FileTable compatível com windows. Esse nome deve ser exclusivo entre todos os nomes de diretório FileTable no banco de dados. A comparação de exclusividade não diferencia maiúsculas de minúsculas, independentemente das configurações de agrupamento. Se esse valor não for especificado, o nome da FileTable será usado.
FILETABLE_COLLATE_FILENAME = { collation_name | database_default }
Aplica-se a: SQL Server 2012 (11.x) e posterior. A Base de Dados SQL do Azure e a Instância Gerida SQL do Azure não suportam FILETABLE
.
Especifica o nome do agrupamento a ser aplicado à coluna Name
na FileTable. O agrupamento não diferencia maiúsculas de minúsculas para estar em conformidade com a semântica de nomenclatura de arquivos do sistema operacional Windows. Se esse valor não for especificado, o agrupamento padrão do banco de dados será usado. Se o agrupamento padrão do banco de dados diferenciar maiúsculas de minúsculas, um erro será gerado e a operação CREATE TABLE falhará.
collation_name
O nome de um agrupamento que não diferencia maiúsculas de minúsculas.
database_default
Especifica que o agrupamento padrão para o banco de dados deve ser usado. Esse agrupamento não diferencia maiúsculas de minúsculas.
FILETABLE_PRIMARY_KEY_CONSTRAINT_NAME = constraint_name
Aplica-se a: SQL Server 2012 (11.x) e posterior. A Base de Dados SQL do Azure e a Instância Gerida SQL do Azure não suportam FILETABLE
.
Especifica o nome a ser usado para a restrição de chave primária que é criada automaticamente na FileTable. Se esse valor não for especificado, o sistema gerará um nome para a restrição.
FILETABLE_STREAMID_UNIQUE_CONSTRAINT_NAME = constraint_name
Aplica-se a: SQL Server 2012 (11.x) e posterior. A Base de Dados SQL do Azure e a Instância Gerida SQL do Azure não suportam FILETABLE
.
Especifica o nome a ser usado para a restrição exclusiva que é criada automaticamente na coluna stream_id na FileTable. Se esse valor não for especificado, o sistema gerará um nome para a restrição.
FILETABLE_FULLPATH_UNIQUE_CONSTRAINT_NAME = constraint_name
Aplica-se a: SQL Server 2012 (11.x) e posterior. A Base de Dados SQL do Azure e a Instância Gerida SQL do Azure não suportam FILETABLE
.
Especifica o nome a ser usado para a restrição exclusiva que é criada automaticamente no parent_path_locator e nome colunas na FileTable. Se esse valor não for especificado, o sistema gerará um nome para a restrição.
SYSTEM_VERSIONING = ON [ ( HISTORY_TABLE = schema_name.history_table_name [ , DATA_CONSISTENCY_CHECK = { ON | DESLIGADO } ] ]
Aplica-se a: SQL Server 2016 (13.x) e posterior, Banco de Dados SQL do Azure e Instância Gerenciada SQL do Azure.
Permite o controle de versão do sistema da tabela se os requisitos de tipo de dados, restrição de anulabilidade e restrição de chave primária forem atendidos. O sistema registrará o histórico de cada registro na tabela com versão do sistema em uma tabela de histórico separada. Se o argumento HISTORY_TABLE
não for usado, o nome desta tabela de histórico será MSSQL_TemporalHistoryFor<primary_table_object_id>
. Se o nome de uma tabela de histórico for especificado durante a criação da tabela de histórico, você deverá especificar o esquema e o nome da tabela.
Se a tabela de histórico não existir, o sistema gerará uma nova tabela de histórico correspondente ao esquema da tabela atual no mesmo grupo de arquivos que a tabela atual, criando um link entre as duas tabelas e permitindo que o sistema registre o histórico de cada registro na tabela atual na tabela de histórico. Por padrão, a tabela de histórico PAGE
é compactada.
Se o argumento HISTORY_TABLE
for usado para criar um link e usar uma tabela de histórico existente, o link será criado entre a tabela atual e a tabela especificada. Se a tabela atual for particionada, a tabela de histórico será criada no grupo de arquivos padrão porque a configuração de particionamento não será replicada automaticamente da tabela atual para a tabela de histórico. Ao criar um link para uma tabela de histórico existente, você pode optar por executar uma verificação de consistência de dados. Essa verificação de consistência de dados garante que os registros existentes não se sobreponham. Executar a verificação de consistência de dados é o padrão.
Use esse argumento com os argumentos PERIOD FOR SYSTEM_TIME
e GENERATED ALWAYS AS ROW { START | END }
para habilitar o controle de versão do sistema em uma tabela. Para obter mais informações, consulte Tabelas temporais. Use esse argumento com o argumento WITH LEDGER = ON
para criar uma tabela contábil atualizável. Não é permitido usar tabelas de histórico existentes com tabelas contábeis.
REMOTE_DATA_ARCHIVE = { ON [ ( table_stretch_options [ ,... n ] ) ] | DESLIGADO ( MIGRATION_STATE = PAUSADO ) }
Aplica-se a: SQL Server 2016 (13.x) e posterior.
Cria a nova tabela com o Stretch Database habilitado ou desabilitado. Para obter mais informações, consulte Stretch Database.
Importante
O Stretch Database foi preterido no SQL Server 2022 (16.x) e no Banco de Dados SQL do Azure. Esse recurso será removido em uma versão futura do Mecanismo de Banco de Dados. Evite usar esse recurso em novos trabalhos de desenvolvimento e planeje modificar aplicativos que atualmente usam esse recurso.
Habilitando o Stretch Database para uma tabela
Ao habilitar o Stretch para uma tabela especificando ON
, você pode, opcionalmente, especificar MIGRATION_STATE = OUTBOUND
para começar a migrar dados imediatamente ou MIGRATION_STATE = PAUSED
adiar a migração de dados. O valor padrão é MIGRATION_STATE = OUTBOUND
. Para saber mais sobre como habilitar o Stretch para uma tabela, veja Habilitar o Stretch Database para uma tabela.
Pré-requisitos. Antes de habilitar o Stretch para uma tabela, você precisa habilitar o Stretch no servidor e no banco de dados. Para obter mais informações, consulte Habilitar o Stretch Database para um banco de dados.
Permissões. Habilitar o Stretch para um banco de dados ou uma tabela requer permissões de db_owner. Habilitar o Stretch para uma tabela também requer permissões ALTER na tabela.
[ FILTER_PREDICATE = { NULL | predicado } ]
Aplica-se a: SQL Server 2016 (13.x) e posterior.
Opcionalmente, especifica um predicado de filtro para selecionar linhas a serem migradas de uma tabela que contém dados históricos e atuais. O predicado deve chamar uma função determinística com valor de tabela embutido. Para saber mais, veja Habilitar o Stretch Database para uma tabela e Selecionar linhas para migrar usando uma função de filtro.
Importante
Se você fornecer um predicado de filtro com desempenho insatisfatório, a migração de dados também terá um desempenho insatisfatório. Stretch Database aplica o predicado de filtro à tabela usando o operador CROSS APPLY.
Se você não especificar um predicado de filtro, a tabela inteira será migrada.
Ao especificar um predicado de filtro, você também precisa especificar MIGRATION_STATE.
MIGRATION_STATE = { SAÍDA | ENTRADA | PAUSADO }
Aplica-se a: SQL Server 2016 (13.x) e posterior, Banco de Dados SQL do Azure e Instância Gerenciada SQL do Azure.
Especifique
OUTBOUND
migrar dados do SQL Server para o Banco de Dados SQL do Azure.Especifique
INBOUND
copiar os dados remotos da tabela do Banco de Dados SQL do Azure de volta para o SQL Server e desabilitar o Stretch para a tabela. Para saber mais, veja Desabilitar o Stretch Database e trazer de volta dados remotos.Esta operação implica custos de transferência de dados e não pode ser cancelada.
Especifique
PAUSED
pausar ou adiar a migração de dados. Para obter mais informações, consulte Pausar e retomar a migração de dados -Stretch Database.
[ DATA_DELETION = ON { ( FILTER_COLUMN = column_name, RETENTION_PERIOD = { INFINITO | número { DIA | DIAS | SEMANA | SEMANAS | MÊS | MESES | ANO | ANOS } ) } ]
Aplica-se a: Somente SQL Edge do Azure
Permite a limpeza baseada em política de retenção de dados antigos ou antigos de tabelas dentro de um banco de dados. Para obter mais informações, consulte Habilitar e desabilitar a retenção de dados. Os parâmetros a seguir devem ser especificados para que a retenção de dados seja habilitada.
FILTER_COLUMN = { column_name }
Especifica a coluna que deve ser usada para determinar se as linhas na tabela estão obsoletas ou não. Os seguintes tipos de dados são permitidos para a coluna de filtro.
- data
- datetime
- datetime2
- smalldatetime
- datetimeoffset
RETENTION_PERIOD = { INFINITO | número {DIA | DIAS | SEMANA | SEMANAS | MÊS | MESES | ANO | ANOS }}
Especifica a política de período de retenção para a tabela. O período de retenção é especificado como uma combinação de um valor inteiro positivo e a unidade de peça de data.
MEMORY_OPTIMIZED
Aplica-se a: SQL Server 2014 (12.x) e posterior, Banco de Dados SQL do Azure e Instância Gerenciada SQL do Azure. A Instância Gerenciada SQL do Azure não oferece suporte a tabelas otimizadas de memória na camada de Uso Geral.
O valor ON indica que a tabela está otimizada para memória. As tabelas com otimização de memória fazem parte do recurso OLTP In-Memory, que é usado para otimizar o desempenho do processamento de transações. Para começar a usar In-Memory OLTP, consulte Guia de início rápido 1: In-Memory tecnologias OLTP parade desempenho de Transact-SQL mais rápido . Para obter informações mais detalhadas sobre tabelas com otimização de memória, consulte Memory-Optimized Tabelas.
O valor padrão OFF indica que a tabela é baseada em disco.
DURABILIDADE
Aplica-se a: SQL Server 2014 (12.x) e posterior, Banco de Dados SQL do Azure e Instância Gerenciada SQL do Azure.
O valor de SCHEMA_AND_DATA
indica que a tabela é durável, o que significa que as alterações são persistentes no disco e sobrevivem à reinicialização ou failover. SCHEMA_AND_DATA é o valor padrão.
O valor de SCHEMA_ONLY
indica que a tabela não é durável. O esquema de tabela é persistente, mas as atualizações de dados não são persistidas após uma reinicialização ou failover do banco de dados.
DURABILITY = SCHEMA_ONLY
só é permitido com MEMORY_OPTIMIZED = ON
.
Advertência
Quando uma tabela é criada com DURABILITY = SCHEMA_ONLY
, e READ_COMMITTED_SNAPSHOT
é subsequentemente alterada usando ALTER DATABASE
, os dados na tabela serão perdidos.
BUCKET_COUNT
Aplica-se a: SQL Server 2014 (12.x) e posterior, Banco de Dados SQL do Azure e Instância Gerenciada SQL do Azure.
Indica o número de buckets que devem ser criados no índice de hash. O valor máximo para BUCKET_COUNT em índices de hash é 1.073.741.824. Para obter mais informações sobre contagens de buckets, consulte Indexes for Memory-Optimized Tables.
Bucket_count é um argumento necessário.
ÍNDICE
Aplica-se a: SQL Server 2014 (12.x) e posterior, Banco de Dados SQL do Azure e Instância Gerenciada SQL do Azure.
Os índices de coluna e tabela podem ser especificados como parte da instrução CREATE TABLE. Para obter detalhes sobre como adicionar e remover índices em tabelas com otimização de memória, consulte Alterando Memory-Optimized tabelas
HASH
Aplica-se a: SQL Server 2014 (12.x) e posterior, Banco de Dados SQL do Azure e Instância Gerenciada SQL do Azure.
Indica que um índice HASH é criado.
Os índices de hash são suportados apenas em tabelas com otimização de memória.
LEDGER = LIGADO ( <ledger_option> [ ,... n ] ) | DESLIGADO
Aplica-se a: SQL Server 2022 (16.x), Banco de Dados SQL do Azure e Instância Gerenciada SQL do Azure.
Observação
Se a instrução criar uma tabela contábil, a permissão ENABLE LEDGER
será necessária.
Indica se a tabela que está sendo criada é uma tabela contábil (ON) ou não (OFF). O padrão é OFF. Se a opção APPEND_ONLY = ON
for especificada, o sistema criará uma tabela contábil somente para acréscimos, permitindo apenas a inserção de novas linhas. Caso contrário, o sistema criará uma tabela contábil atualizável. Uma tabela contábil atualizável também requer o argumento SYSTEM_VERSIONING = ON
. Uma tabela contábil atualizável também deve ser uma tabela com versão do sistema. No entanto, uma tabela contábil atualizável não precisa ser uma tabela temporal (não requer o parâmetro PERIOD FOR SYSTEM_TIME
). Se a tabela de histórico for especificada com LEDGER = ON
e SYSTEM_VERSIONING = ON
, ela não deverá fazer referência a uma tabela existente.
Um banco de dados contábil (um banco de dados criado com a opção LEDGER = ON
) só permite a criação de tabelas contábeis. As tentativas de criar uma tabela com LEDGER = OFF
gerarão um erro. Cada nova tabela por padrão é criada como uma tabela contábil atualizável, mesmo que você não especifique LEDGER = ON
, e será criada com valores padrão para todos os outros parâmetros.
Uma tabela contábil atualizável deve conter quatro colunas GENERATED ALWAYS
, exatamente uma coluna definida com cada um dos seguintes argumentos:
GENERATED ALWAYS AS TRANSACTION_ID START
GENERATED ALWAYS AS TRANSACTION_ID END
GENERATED ALWAYS AS SEQUENCE_NUMBER START
GENERATED ALWAYS AS SEQUENCE_NUMBER END
Uma tabela contábil somente acréscimo deve conter exatamente uma coluna definida com cada um dos seguintes argumentos:
GENERATED ALWAYS AS TRANSACTION_ID START
GENERATED ALWAYS AS SEQUENCE_NUMBER START
Se alguma das colunas geradas sempre necessárias não estiver definida na instrução CREATE TABLE
e a instrução incluir LEDGER = ON
, o sistema tentará automaticamente adicionar a coluna usando uma definição de coluna aplicável da lista abaixo. Se houver um conflito de nome com uma coluna já definida, o sistema gerará um erro.
[ledger_start_transaction_id] BIGINT GENERATED ALWAYS AS TRANSACTION_ID START HIDDEN NOT NULL
[ledger_end_transaction_id] BIGINT GENERATED ALWAYS AS TRANSACTION_ID END HIDDEN NULL
[ledger_start_sequence_number] BIGINT GENERATED ALWAYS AS SEQUENCE_NUMBER START HIDDEN NOT NULL
[ledger_end_sequence_number] BIGINT GENERATED ALWAYS AS SEQUENCE_NUMBER END HIDDEN NULL
O <ledger_view_option> especifica o esquema e o nome da exibição do razão o sistema cria automaticamente e vincula à tabela. Se a opção não for especificada, o sistema gerará o nome da vista contábil anexando_Ledger
ao nome da tabela que está sendo criada (database_name.schema_name.table_name
). Se existir uma vista com o nome especificado ou gerado, o sistema irá gerar um erro. Se a tabela for uma tabela contábil atualizável, a exibição do razão será criada como uma união na tabela e sua tabela de histórico.
Cada linha na visualização do razão representa a criação ou a exclusão de uma versão de linha na tabela contábil. A visualização contábil contém todas as colunas da tabela contábil, exceto as colunas geradas sempre listadas acima. A visualização contábil também contém as seguintes colunas adicionais:
Nome da coluna | Tipo de dados | Descrição |
---|---|---|
Especificado usando a opção TRANSACTION_ID_COLUMN_NAME .
ledger_transaction_id se não for especificado. |
bigint | A ID da transação que criou ou excluiu uma versão de linha. |
Especificado usando a opção SEQUENCE_NUMBER_COLUMN_NAME .
ledger_sequence_number se não for especificado. |
bigint | O número de sequência de uma operação de nível de linha dentro da transação na tabela. |
Especificado usando a opção OPERATION_TYPE_COLUMN_NAME .
ledger_operation_type se não for especificado. |
tinyint | Contém 1 (INSERT ) ou 2 (DELETE ). A inserção de uma linha na tabela contábil produz uma nova linha na exibição contábil contendo 1 nesta coluna. A exclusão de uma linha da tabela contábil produz uma nova linha na exibição contábil contendo 2 nesta coluna. A atualização de uma linha na tabela contábil produz duas novas linhas na exibição contábil. Uma linha contém 2 (DELETE ) e a outra linha contém 1 (INSERT ) nesta coluna. |
Especificado usando a opção OPERATION_TYPE_DESC_COLUMN_NAME .
ledger_operation_type_desc se não for especificado. |
Nvarchar(128) | Contém INSERT ou DELETE . Veja acima para detalhes. |
As transações que incluem a criação de tabelas contábeis são capturadas em sys.database_ledger_transactions.
<ledger_option> ::=
Especifica uma opção de contabilidade.
[ LEDGER_VIEW = schema_name.ledger_view_name [ ( <ledger_view_option> [ ,... n ] ]
Especifica o nome da exibição contábil e os nomes das colunas adicionais que o sistema adiciona à exibição contábil.
[ APPEND_ONLY = ATIVADO | DESLIGADO ]
Especifica se a tabela contábil que está sendo criada é somente acréscimo ou atualizável. O padrão é OFF
.
<ledger_view_option> ::=
Especifica uma ou mais opções de exibição contábil. Cada uma das opções de visualização contábil especifica um nome de uma coluna, o sistema adicionará à exibição, além das colunas definidas na tabela contábil.
[ TRANSACTION_ID_COLUMN_NAME = transaction_id_column_name ]
Especifica o nome da coluna que armazena a ID da transação que criou ou excluiu uma versão de linha. O nome da coluna padrão é ledger_transaction_id
.
[ SEQUENCE_NUMBER_COLUMN_NAME = sequence_number_column_name ]
Especifica o nome das colunas que armazenam o número de sequência de uma operação em nível de linha dentro da transação na tabela. O nome da coluna padrão é ledger_sequence_number
.
[ OPERATION_TYPE_COLUMN_NAME = operation_type_id column_name ]
Especifica o nome das colunas que armazenam o ID do tipo de operação. O nome da coluna padrão é ledger_operation_type.
[ OPERATION_TYPE_DESC_COLUMN_NAME = operation_type_desc_column_name ]
Especifica o nome das colunas que armazenam a descrição do tipo de operação. O nome da coluna padrão é ledger_operation_type_desc
.
Comentários
Para obter informações sobre o número de tabelas, colunas, restrições e índices permitidos, consulte Especificações de capacidade máxima para o SQL Server.
O espaço é geralmente alocado a tabelas e índices em incrementos de uma extensão de cada vez. Quando a opção SET MIXED_PAGE_ALLOCATION
de ALTER DATABASE
é definida como TRUE, ou sempre antes do SQL Server 2016 (13.x), quando uma tabela ou índice é criado, são alocadas páginas de extensões mistas até que tenha páginas suficientes para preencher uma extensão uniforme. Depois de ter páginas suficientes para preencher uma extensão uniforme, outra extensão é alocada cada vez que as extensões atualmente alocadas se tornam cheias. Para obter um relatório sobre a quantidade de espaço alocado e usado por uma tabela, execute sp_spaceused
.
O Mecanismo de Banco de Dados não impõe uma ordem na qual as restrições DEFAULT, IDENTITY, ROWGUIDCOL ou coluna são especificadas em uma definição de coluna.
Quando uma tabela é criada, a opção IDENTIFICADOR COTADO é sempre armazenada como ATIVADA nos metadados da tabela, mesmo que a opção esteja definida como OFF quando a tabela é criada.
No banco de dados SQL no Microsoft Fabric, alguns recursos de tabela podem ser criados, mas não serão espelhados no Fabric OneLake. Para obter mais informações, consulte Limitações do espelhamento do banco de dados SQL de malha.
Quadros temporários
Você pode criar tabelas temporárias locais e globais. As tabelas temporárias locais são visíveis apenas na sessão atual e as tabelas temporárias globais são visíveis para todas as sessões. As tabelas temporárias não podem ser particionadas.
Prefixar nomes de tabelas temporárias locais com sinal numérico único (#table_name
) e prefixar nomes de tabelas temporárias globais com um sinal de número duplo (##table_name
).
Transact-SQL instruções fazem referência à tabela temporária usando o valor especificado para table_name na instrução CREATE TABLE
, por exemplo:
CREATE TABLE #MyTempTable
(
col1 INT PRIMARY KEY
);
INSERT INTO #MyTempTable
VALUES (1);
Se mais de uma tabela temporária for criada dentro de um único procedimento armazenado ou lote, elas deverão ter nomes diferentes.
Se você incluir um schema_name ao criar ou acessar uma tabela temporária, ele será ignorado. Todas as tabelas temporárias são criadas no esquema dbo
.
Se uma tabela temporária local for criada em um procedimento armazenado ou um módulo SQL que possa ser executado ao mesmo tempo por várias sessões, o Mecanismo de Banco de Dados deverá ser capaz de distinguir as tabelas criadas pelas diferentes sessões. O Mecanismo de Banco de Dados faz isso anexando internamente um sufixo exclusivo a cada nome de tabela temporária local. O nome completo de uma tabela temporária, conforme armazenado na tabela sys.objects
em tempdb
é composto pelo nome da tabela especificado na instrução CREATE TABLE
e pelo sufixo exclusivo gerado pelo sistema. Para permitir o sufixo, table_name especificado para um nome temporário local não pode exceder 116 caracteres.
As tabelas temporárias são automaticamente descartadas quando saem do escopo, a menos que sejam explicitamente descartadas anteriormente usando DROP TABLE
:
- Uma tabela temporária local criada em um procedimento armazenado é descartada automaticamente quando o procedimento armazenado é concluído. A tabela pode ser referenciada por quaisquer procedimentos armazenados aninhados executados pelo procedimento armazenado que criou a tabela. A tabela não pode ser referenciada pelo processo que chamou o procedimento armazenado que criou a tabela.
- Todas as outras tabelas temporárias locais são descartadas automaticamente no final da sessão atual.
- Se a configuração de escopo de banco de dados
GLOBAL_TEMPORARY_TABLE_AUTO_DROP
estiver definida como ON (padrão), as tabelas temporárias globais serão automaticamente descartadas quando a sessão que criou a tabela terminar e todas as outras tarefas pararem de fazer referência a elas. A associação entre uma tarefa e uma tabela é mantida apenas durante a vida de uma única instrução Transact-SQL. Isso significa que uma tabela temporária global é descartada na conclusão da última instrução Transact-SQL que estava ativamente referenciando a tabela quando a sessão de criação terminou. - Se a configuração de escopo de banco de dados
GLOBAL_TEMPORARY_TABLE_AUTO_DROP
estiver definida como OFF, as tabelas temporárias globais serão descartadas apenas usandoDROP TABLE
ou quando a instância do Mecanismo de Banco de Dados for reiniciada. Para obter mais informações, consulte GLOBAL_TEMPORARY_TABLE_AUTO_DROP.
Uma tabela temporária local criada dentro de um procedimento armazenado ou gatilho pode ter o mesmo nome de uma tabela temporária que foi criada antes do procedimento armazenado ou gatilho ser chamado. No entanto, se uma consulta fizer referência a uma tabela temporária e existirem duas tabelas temporárias com o mesmo nome naquele momento, não será definido em qual tabela a consulta será resolvida. Os procedimentos armazenados aninhados também podem criar tabelas temporárias com o mesmo nome de uma tabela temporária criada pelo procedimento armazenado de chamada. No entanto, para que as modificações sejam resolvidas na tabela que foi criada no procedimento aninhado, a tabela deve ter a mesma estrutura, com os mesmos nomes de coluna, que a tabela criada no procedimento de chamada. Isso é mostrado no exemplo a seguir.
CREATE PROCEDURE dbo.Test2
AS
CREATE TABLE #t
(
x INT PRIMARY KEY
);
INSERT INTO #t
VALUES (2);
SELECT x AS Test2Col
FROM #t;
GO
CREATE PROCEDURE dbo.Test1
AS
CREATE TABLE #t
(
x INT PRIMARY KEY
);
INSERT INTO #t
VALUES (1);
SELECT x AS Test1Col
FROM #t;
EXECUTE Test2;
GO
CREATE TABLE #t
(
x INT PRIMARY KEY
);
INSERT INTO #t
VALUES (99);
GO
EXECUTE Test1;
GO
Aqui está o conjunto de resultados.
(1 row(s) affected)
Test1Col
-----------
1
(1 row(s) affected)
Test2Col
-----------
2
Quando você cria tabelas temporárias locais ou globais, a sintaxe CREATE TABLE
oferece suporte a definições de restrição, exceto restrições de FOREIGN KEY
. Se uma restrição de FOREIGN KEY
for especificada em uma tabela temporária, a instrução retornará uma mensagem de aviso informando que a restrição foi ignorada. A tabela ainda é criada sem a restrição de FOREIGN KEY
. As tabelas temporárias não podem ser referenciadas em restrições de FOREIGN KEY
.
Se uma tabela temporária for criada com uma restrição nomeada e a tabela temporária for criada dentro do escopo de uma transação definida pelo usuário, apenas um usuário de cada vez poderá executar a instrução que cria a tabela temporária. Por exemplo, se um procedimento armazenado criar uma tabela temporária com uma restrição de chave primária nomeada, o procedimento armazenado não poderá ser executado simultaneamente por vários usuários.
Tabelas temporárias globais com escopo de banco de dados no Banco de Dados SQL do Azure
As tabelas temporárias globais no SQL Server (nomes de tabela prefixados com ##
) são armazenadas no tempdb
e compartilhadas entre todas as sessões de usuário em toda a instância do SQL Server.
O Banco de Dados SQL do Azure dá suporte a tabelas temporárias globais que também são armazenadas em tempdb
mas têm escopo para o nível do banco de dados. Isso significa que as tabelas temporárias globais são compartilhadas entre todas as sessões de usuário dentro do mesmo banco de dados. As sessões de usuário de outros bancos de dados não podem acessar tabelas temporárias globais. Caso contrário, as tabelas temporárias globais para o Banco de Dados SQL do Azure seguirão a mesma sintaxe e semântica que o SQL Server usa.
Da mesma forma, os procedimentos armazenados temporários globais também têm escopo para o nível do banco de dados no Banco de Dados SQL do Azure.
As tabelas temporárias locais (nomes de tabela prefixados com #
) também têm suporte para o Banco de Dados SQL do Azure e seguem a mesma sintaxe e semântica que o SQL Server usa. Para obter mais informações, consulte Tabelas temporárias.
Permissões para objetos temporários
Qualquer usuário pode criar e acessar objetos temporários.
Tabelas particionadas
Antes de criar uma tabela particionada usando CREATE TABLE, você deve primeiro criar uma função de partição para especificar como a tabela se torna particionada. Uma função de partição é criada usando CREATE PARTITION FUNCTION. Em segundo lugar, você deve criar um esquema de partição para especificar os grupos de arquivos que manterão as partições indicadas pela função de partição. Um esquema de partição é criado usando CREATE PARTITION SCHEME. O posicionamento de restrições de CHAVE PRIMÁRIA ou EXCLUSIVO para separar grupos de arquivos não pode ser especificado para tabelas particionadas. Para obter mais informações, consulte tabelas particionadas e índices.
Restrições de CHAVE PRIMÁRIA
Uma tabela pode conter apenas uma restrição de CHAVE PRIMÁRIA.
O índice gerado por uma restrição de CHAVE PRIMÁRIA não pode fazer com que o número de índices na tabela exceda 999 índices não clusterizados e 1 índice clusterizado.
Se CLUSTERED ou NONCLUSTERED não for especificado para uma restrição de CHAVE PRIMÁRIA, CLUSTERED será usado se não houver índices clusterizados especificados para restrições UNIQUE.
Todas as colunas definidas dentro de uma restrição PRIMARY KEY devem ser definidas como NOT NULL. Se a anulabilidade não for especificada, todas as colunas que participam de uma restrição de CHAVE PRIMÁRIA terão sua anulabilidade definida como NOT NULL.
Observação
Para tabelas com otimização de memória, a coluna de chave anulável é permitida.
Se uma chave primária for definida em uma coluna de tipo definido pelo usuário CLR, a implementação do tipo deverá suportar ordenação binária. Para obter mais informações, consulte CLR User-Defined Types.
Restrições ÚNICAS
- Se CLUSTERED ou NONCLUSTERED não for especificado para uma restrição UNIQUE, NONCLUSTERED será usado por padrão.
- Cada restrição UNIQUE gera um índice. O número de restrições UNIQUE não pode fazer com que o número de índices na tabela exceda 999 índices não agrupados e 1 índice clusterizado.
- Se uma restrição exclusiva for definida em uma coluna de tipo definido pelo usuário CLR, a implementação do tipo deverá suportar ordenação binária ou baseada em operador. Para obter mais informações, consulte CLR User-Defined Types.
RESTRIÇÕES DE CHAVE ESTRANGEIRA
Quando um valor diferente de NULL é inserido na coluna de uma restrição FOREIGN KEY, o valor deve existir na coluna referenciada; caso contrário, uma mensagem de erro de violação de chave estrangeira será retornada.
As restrições de CHAVE ESTRANGEIRA são aplicadas à coluna anterior, a menos que as colunas de origem sejam especificadas.
As restrições de CHAVE ESTRANGEIRA podem fazer referência apenas a tabelas dentro do mesmo banco de dados no mesmo servidor. A integridade referencial entre bancos de dados deve ser implementada por meio de gatilhos. Para obter mais informações, consulte CREATE TRIGGER.
As restrições de CHAVE ESTRANGEIRA podem fazer referência a outra coluna na mesma tabela. Isto é referido como uma autorreferência.
A cláusula REFERENCES de uma restrição FOREIGN KEY em nível de coluna pode listar apenas uma coluna de referência. Esta coluna deve ter o mesmo tipo de dados que a coluna na qual a restrição está definida.
A cláusula REFERENCES de uma restrição FOREIGN KEY no nível da tabela deve ter o mesmo número de colunas de referência que o número de colunas na lista de colunas de restrição. O tipo de dados de cada coluna de referência também deve ser o mesmo que a coluna correspondente na lista de colunas. As colunas de referência devem ser especificadas na mesma ordem que foi usada ao especificar as colunas da chave primária ou restrição exclusiva na tabela referenciada.
CASCADE, SET NULL ou SET DEFAULT não podem ser especificados se uma coluna do tipo carimbo de data/hora fizer parte da chave estrangeira ou da chave referenciada.
CASCADE, SET NULL, SET DEFAULT e NO ACTION podem ser combinados em tabelas que têm relações referenciais entre si. Se o Mecanismo de Banco de Dados encontrar NO ACTION, ele interromperá e reverterá as ações relacionadas CASCADE, SET NULL e SET DEFAULT. Quando uma instrução DELETE causa uma combinação de ações CASCADE, SET NULL, SET DEFAULT e NO ACTION, todas as ações CASCADE, SET NULL e SET DEFAULT são aplicadas antes que o Mecanismo de Banco de Dados verifique se há qualquer NO ACTION.
O Mecanismo de Banco de Dados não tem um limite predefinido para o número de restrições de CHAVE ESTRANGEIRA que uma tabela pode conter para fazer referência a outras tabelas ou para o número de restrições de CHAVE ESTRANGEIRA pertencentes a outras tabelas que fazem referência a uma tabela específica.
No entanto, o número real de restrições de CHAVE ESTRANGEIRA que podem ser usadas é limitado pela configuração de hardware e pelo design do banco de dados e do aplicativo. Recomendamos que uma tabela contenha no máximo 253 restrições de CHAVE ESTRANGEIRA e que seja referenciada por não mais de 253 restrições de CHAVE ESTRANGEIRA. O limite efetivo para você pode ser mais ou menos, dependendo do aplicativo e do hardware. Considere o custo de impor restrições de CHAVE ESTRANGEIRA ao projetar seu banco de dados e aplicativos.
As restrições de CHAVE ESTRANGEIRA não são impostas em tabelas temporárias.
As restrições de CHAVE ESTRANGEIRA podem fazer referência apenas a colunas em restrições de CHAVE PRIMÁRIA ou EXCLUSIVA na tabela referenciada ou em um ÍNDICE EXCLUSIVO na tabela referenciada.
Se uma chave estrangeira for definida em uma coluna de tipo definido pelo usuário CLR, a implementação do tipo deverá suportar ordenação binária. Para obter mais informações, consulte CLR User-Defined Types.
As colunas que participam de uma relação de chave estrangeira devem ser definidas com o mesmo comprimento e escala.
Definições PADRÃO
Uma coluna pode ter apenas uma definição DEFAULT.
Uma definição DEFAULT pode conter valores constantes, funções, funções niladic padrão SQL ou
NULL
. A tabela a seguir mostra as funções niladic e os valores que elas retornam para o padrão durante uma instrução INSERT.Função niladic SQL-92 Valor devolvido CURRENT_TIMESTAMP
Data e hora atuais. CURRENT_USER
Nome do usuário que executa uma inserção. SESSION_USER
Nome do usuário que executa uma inserção. SYSTEM_USER
Nome do usuário que executa uma inserção. USER
Nome do usuário que executa uma inserção. constant_expression em uma definição PADRÃO não pode se referir a outra coluna na tabela ou a outras tabelas, exibições ou procedimentos armazenados.
As definições DEFAULT não podem ser criadas em colunas com um carimbo de data/hora tipo de dados ou colunas com uma propriedade IDENTITY.
As definições DEFAULT não podem ser criadas para colunas com tipos de dados de alias se o tipo de dados de alias estiver vinculado a um objeto padrão.
Restrições CHECK
Uma coluna pode ter qualquer número de restrições CHECK e a condição pode incluir várias expressões lógicas combinadas com AND e OR. Várias restrições CHECK para uma coluna são validadas na ordem em que são criadas.
A condição de pesquisa deve ser avaliada para uma expressão booleana e não pode fazer referência a outra tabela.
Uma restrição CHECK no nível da coluna pode fazer referência apenas à coluna restrita e uma restrição CHECK no nível da tabela pode fazer referência apenas a colunas na mesma tabela.
CHECK CONSTRAINTS e regras têm a mesma função de validar os dados durante as instruções INSERT e UPDATE.
Quando existe uma regra e uma ou mais restrições CHECK para uma coluna ou colunas, todas as restrições são avaliadas.
As restrições CHECK não podem ser definidas em de texto, ntextou imagem colunas.
Mais informações sobre restrições
- Um índice criado para uma restrição não pode ser descartado usando
DROP INDEX
; a restrição deve ser eliminada usandoALTER TABLE
. Um índice criado e usado por uma restrição pode ser reconstruído usandoALTER INDEX ... REBUILD
. Para obter mais informações, consulte Reorganizar e reconstruir índices. - Os nomes de restrição devem seguir as regras para identificadores de , exceto que o nome não pode começar com um sinal numérico (#). Se constraint_name não for fornecido, um nome gerado pelo sistema será atribuído à restrição. O nome da restrição aparece em qualquer mensagem de erro sobre violações de restrição.
- Quando uma restrição é violada em uma instrução
INSERT
,UPDATE
ouDELETE
, a instrução é encerrada. No entanto, quandoSET XACT_ABORT
é definido como OFF, a transação, se a declaração fizer parte de uma transação explícita, continua a ser processada. QuandoSET XACT_ABORT
é definido como ON, toda a transação é revertida. Você também pode usar a instruçãoROLLBACK TRANSACTION
com a definição de transação verificando a função@@ERROR
sistema. - Quando
ALLOW_ROW_LOCKS = ON
eALLOW_PAGE_LOCK = ON
, bloqueios de linha, página e nível de tabela são permitidos quando você acessa o índice. O Mecanismo de Banco de Dados escolhe o bloqueio apropriado e pode escalá-lo de um bloqueio de linha ou página para um bloqueio de tabela. QuandoALLOW_ROW_LOCKS = OFF
eALLOW_PAGE_LOCK = OFF
, apenas um bloqueio no nível da tabela é permitido quando você acessa o índice. - Se uma tabela tiver FOREIGN KEY ou CHECK CONSTRAINTS e triggers, as condições de restrição serão avaliadas antes que o gatilho seja executado.
Para um relatório em uma tabela e suas colunas, use sp_help
ou sp_helpconstraint
. Para renomear uma tabela, use sp_rename
. Para obter um relatório sobre as exibições e os procedimentos armazenados que dependem de uma tabela, use sys.dm_sql_referenced_entities e sys.dm_sql_referencing_entities.
Regras de anulabilidade dentro de uma definição de tabela
A anulabilidade de uma coluna determina se essa coluna pode permitir um valor nulo (NULL
) como os dados nessa coluna.
NULL
não é zero ou em branco: NULL
significa que nenhuma entrada foi feita ou uma NULL
explícita foi fornecida, e normalmente implica que o valor é desconhecido ou não aplicável.
Quando você usa CREATE TABLE
ou ALTER TABLE
para criar ou alterar uma tabela, as configurações de banco de dados e sessão influenciam e, possivelmente, anulam a anulabilidade do tipo de dados usado em uma definição de coluna. Recomendamos que você sempre defina explicitamente uma coluna como NULL ou NOT NULL para colunas não computadas ou, se você usar um tipo de dados definido pelo usuário, permita que a coluna use a anulabilidade padrão do tipo de dados. Colunas esparsas devem sempre permitir NULL.
Quando a anulabilidade da coluna não é especificada explicitamente, a anulabilidade da coluna segue as regras mostradas na tabela a seguir.
Tipo de dados de coluna | Regra |
---|---|
Tipo de dados de alias | O Mecanismo de Banco de Dados usa a anulabilidade especificada quando o tipo de dados foi criado. Para determinar a anulabilidade padrão do tipo de dados, use sp_help . |
Tipo CLR definido pelo usuário | A anulabilidade é determinada de acordo com a definição da coluna. |
Tipo de dados fornecidos pelo sistema | Se o tipo de dados fornecido pelo sistema tiver apenas uma opção, ele terá precedência.
carimbo de data/hora tipos de dados devem ser NOT NULL. Quando qualquer configuração de sessão é definida como ATIVADA usando SET :ANSI_NULL_DFLT_ON = ON , NULL é atribuído.ANSI_NULL_DFLT_OFF = ON , NOT NULL é atribuído.Quando qualquer configuração de banco de dados é definida usando ALTER DATABASE :ANSI_NULL_DEFAULT_ON = ON , NULL é atribuído.ANSI_NULL_DEFAULT_OFF = ON , NOT NULL é atribuído.Para exibir a configuração do banco de dados para ANSI_NULL_DEFAULT , use o sys.databases exibição de catálogo |
Quando nenhuma das opções de ANSI_NULL_DFLT é definida para a sessão e o banco de dados é definido como padrão (ANSI_NULL_DEFAULT é OFF), o padrão de NOT NULL é atribuído.
Se a coluna for uma coluna calculada, sua anulabilidade será sempre determinada automaticamente pelo Mecanismo de Banco de Dados. Para descobrir a anulabilidade desse tipo de coluna, use a função COLUMNPROPERTY
com a propriedade AllowsNull.
Observação
O driver ODBC do SQL Server e o driver OLE DB do SQL Server usam como padrão ter ANSI_NULL_DFLT_ON definidos como ON. Os usuários ODBC e OLE DB podem configurar isso em fontes de dados ODBC ou com atributos de conexão ou propriedades definidas pelo aplicativo.
Compressão de dados
As tabelas do sistema não podem ser ativadas para compressão. Quando você está criando uma tabela, a compactação de dados é definida como NONE, a menos que especificado de outra forma. Se você especificar uma lista de partições ou uma partição fora do intervalo, um erro será gerado. Para obter mais informações sobre compactação de dados, consulte de compactação de dados .
Para avaliar como a alteração do estado de compactação afetará uma tabela, um índice ou uma partição, use o procedimento armazenado sp_estimate_data_compression_savings.
Permissões
Requer CREATE TABLE
permissão no banco de dados e ALTER
permissão no esquema no qual a tabela está sendo criada.
Se alguma coluna na instrução CREATE TABLE
for definida como sendo de um tipo definido pelo usuário, REFERENCES
permissão no tipo definido pelo usuário será necessária.
Se alguma coluna na instrução CREATE TABLE
for definida como sendo de um tipo CLR definido pelo usuário, a propriedade do tipo ou REFERENCES
permissão nela será necessária.
Se alguma coluna na instrução CREATE TABLE
tiver uma coleção de esquema XML associada a elas, será necessária a propriedade da coleção de esquema XML ou REFERENCES
permissão nela.
Qualquer usuário pode criar tabelas temporárias no tempdb
.
Se a instrução criar uma tabela contábil, ENABLE LEDGER
permissão será necessária.
Exemplos
Um. Criar uma restrição de CHAVE PRIMÁRIA em uma coluna
O exemplo a seguir mostra a definição de coluna para uma restrição de CHAVE PRIMÁRIA com um índice clusterizado na coluna EmployeeID
da tabela Employee
. Como um nome de restrição não é especificado, o sistema fornece o nome de restrição.
CREATE TABLE dbo.Employee
(
EmployeeID INT PRIMARY KEY CLUSTERED
);
B. Usar restrições de CHAVE ESTRANGEIRA
Uma restrição de chave estrangeira é usada para fazer referência a outra tabela. As chaves estrangeiras podem ser chaves de coluna única ou chaves de várias colunas. Este exemplo a seguir mostra uma restrição FOREIGN KEY de coluna única na tabela SalesOrderHeader
que faz referência à tabela SalesPerson
. Somente a cláusula REFERENCES é necessária para uma restrição FOREIGN KEY de coluna única.
SalesPersonID INT NULL REFERENCES SalesPerson(SalesPersonID)
Você também pode usar explicitamente a cláusula FOREIGN KEY e reafirmar o atributo column. O nome da coluna não precisa ser o mesmo em ambas as tabelas.
FOREIGN KEY (SalesPersonID) REFERENCES SalesPerson(SalesPersonID)
As restrições de chave de várias colunas são criadas como restrições de tabela. No banco de dados AdventureWorks2022
, a tabela SpecialOfferProduct
inclui uma CHAVE PRIMÁRIA de várias colunas. O exemplo a seguir mostra como fazer referência a essa chave de outra tabela; Um nome de restrição explícito é opcional.
CONSTRAINT FK_SpecialOfferProduct_SalesOrderDetail
FOREIGN KEY (ProductID, SpecialOfferID)
REFERENCES SpecialOfferProduct (ProductID, SpecialOfferID)
C. Usar restrições EXCLUSIVAS
As restrições UNIQUE são usadas para impor exclusividade em colunas de chave não primária. O exemplo a seguir impõe uma restrição de que a coluna Name
da tabela Product
deve ser exclusiva.
Name NVARCHAR(100) NOT NULL
UNIQUE NONCLUSTERED
D. Usar definições PADRÃO
Os padrões fornecem um valor (com as instruções INSERT e UPDATE) quando nenhum valor é fornecido. Por exemplo, o banco de dados AdventureWorks2022
pode incluir uma tabela de pesquisa listando os diferentes empregos que os funcionários podem preencher na empresa. Em uma coluna que descreve cada trabalho, uma cadeia de caracteres padrão pode fornecer uma descrição quando uma descrição real não é inserida explicitamente.
DEFAULT 'New Position - title not formalized yet'
Além de constantes, as definições DEFAULT podem incluir funções. Use o exemplo a seguir para obter a data atual de uma entrada.
DEFAULT (GETDATE())
Uma verificação de função niládica também pode melhorar a integridade dos dados. Para controlar o usuário que inseriu uma linha, use a função niládica para USER. Não coloque as funções niládicas entre parênteses.
DEFAULT USER
E. Usar restrições CHECK
O exemplo a seguir mostra uma restrição feita a valores que são inseridos na coluna CreditRating
da tabela Vendor
. A restrição não tem nome.
CHECK (CreditRating >= 1 and CreditRating <= 5)
Este exemplo mostra uma restrição nomeada com uma restrição de padrão nos dados de caracteres inseridos em uma coluna de uma tabela.
CONSTRAINT CK_emp_id CHECK (
emp_id LIKE '[A-Z][A-Z][A-Z][1-9][0-9][0-9][0-9][0-9][FM]'
OR emp_id LIKE '[A-Z]-[A-Z][1-9][0-9][0-9][0-9][0-9][FM]'
)
Este exemplo especifica que os valores devem estar dentro de uma lista específica ou seguir um padrão especificado.
CHECK (
emp_id IN ('1389', '0736', '0877', '1622', '1756')
OR emp_id LIKE '99[0-9][0-9]'
)
F. Mostrar a definição completa da tabela
O exemplo a seguir mostra as definições de tabela completas com todas as definições de restrição para PurchaseOrderDetail
de tabela criadas no banco de dados AdventureWorks2022
. Para executar o exemplo, o esquema da tabela é alterado para dbo
.
CREATE TABLE dbo.PurchaseOrderDetail
(
PurchaseOrderID INT NOT NULL FOREIGN KEY REFERENCES Purchasing.PurchaseOrderHeader (PurchaseOrderID),
LineNumber SMALLINT NOT NULL,
ProductID INT NULL FOREIGN KEY REFERENCES Production.Product (ProductID),
UnitPrice MONEY NULL,
OrderQty SMALLINT NULL,
ReceivedQty FLOAT NULL,
RejectedQty FLOAT NULL,
DueDate DATETIME NULL,
rowguid UNIQUEIDENTIFIER CONSTRAINT DF_PurchaseOrderDetail_rowguid DEFAULT (NEWID()) ROWGUIDCOL NOT NULL,
ModifiedDate DATETIME CONSTRAINT DF_PurchaseOrderDetail_ModifiedDate DEFAULT (GETDATE()) NOT NULL,
LineTotal AS ((UnitPrice * OrderQty)),
StockedQty AS ((ReceivedQty - RejectedQty)),
CONSTRAINT PK_PurchaseOrderDetail_PurchaseOrderID_LineNumber PRIMARY KEY CLUSTERED (PurchaseOrderID, LineNumber) WITH (IGNORE_DUP_KEY = OFF)
) ON [PRIMARY];
G. Criar uma tabela com uma coluna xml digitada para uma coleção de esquema XML
O exemplo a seguir cria uma tabela com uma coluna xml
que é digitada para a coleção de esquema XML HRResumeSchemaCollection
. A palavra-chave DOCUMENT
especifica que cada instância do tipo de dados xml
no column_name pode conter apenas um elemento de nível superior.
CREATE TABLE HumanResources.EmployeeResumes
(
LName NVARCHAR (25),
FName NVARCHAR (25),
Resume XML(DOCUMENT HumanResources.HRResumeSchemaCollection)
);
H. Criar uma tabela particionada
O exemplo a seguir cria uma função de partição para particionar uma tabela ou índice em quatro partições. Em seguida, o exemplo cria um esquema de partição que especifica os grupos de arquivos nos quais armazenar cada uma das quatro partições. Finalmente, o exemplo cria uma tabela que usa o esquema de partição. Este exemplo pressupõe que os grupos de arquivos já existem no banco de dados.
CREATE PARTITION FUNCTION myRangePF1(INT)
AS RANGE LEFT
FOR VALUES (1, 100, 1000);
GO
CREATE PARTITION SCHEME myRangePS1
AS PARTITION myRangePF1
TO (test1fg, test2fg, test3fg, test4fg);
GO
CREATE TABLE PartitionTable
(
col1 INT,
col2 CHAR (10)
) ON myRangePS1 (col1);
GO
Com base nos valores de coluna col1
de PartitionTable
, as partições são atribuídas das seguintes maneiras.
Grupo de arquivos | test1fg | test2fg | test3fg | test4fg |
---|---|---|---|---|
Partição | 1 | 2 | 3 | 4 |
Valores | col 1 <= 1 |
col1 > 1 AND col1 <= 100 |
col1 > 100 AND col1 <= 1,000 |
col1 > 1000 |
Eu. Usar o tipo de dados UNIQUEIDENTIFIER em uma coluna
O exemplo a seguir cria uma tabela com uma coluna uniqueidentifier
. O exemplo usa uma restrição PRIMARY KEY para proteger a tabela contra usuários que inserem valores duplicados e usa a função NEWSEQUENTIALID()
na restrição DEFAULT
para fornecer valores para novas linhas. A propriedade ROWGUIDCOL é aplicada à coluna uniqueidentifier
para que possa ser referenciada usando a palavra-chave $ROWGUID.
CREATE TABLE dbo.Globally_Unique_Data
(
GUID UNIQUEIDENTIFIER CONSTRAINT Guid_Default DEFAULT NEWSEQUENTIALID() ROWGUIDCOL,
Employee_Name VARCHAR (60) CONSTRAINT Guid_PK PRIMARY KEY (GUID)
);
J. Usar uma expressão para uma coluna computada
O exemplo a seguir mostra o uso de uma expressão ((low + high)/2
) para calcular a coluna myavg
computada.
CREATE TABLE dbo.mytable
(
low INT,
high INT,
myavg AS (low + high) / 2
);
K. Criar uma coluna computada com base em uma coluna de tipo definida pelo usuário
O exemplo a seguir cria uma tabela com uma coluna definida como tipo definido pelo usuário utf8string
, supondo que o assembly do tipo e o próprio tipo já tenham sido criados no banco de dados atual. Uma segunda coluna é definida com base em utf8string
e usa ToString()
de método de tipo(classe)utf8string
para calcular um valor para a coluna.
CREATE TABLE UDTypeTable
(
u UTF8STRING,
ustr AS u.ToString() PERSISTED
);
L. Usar a função USER_NAME para uma coluna computada
O exemplo a seguir usa a função USER_NAME()
na coluna myuser_name
.
CREATE TABLE dbo.mylogintable
(
date_in DATETIME,
user_id INT,
myuser_name AS USER_NAME()
);
M. Criar uma tabela que tenha uma coluna FILESTREAM
O exemplo a seguir cria uma tabela que tem uma coluna FILESTREAM
Photo
. Se uma tabela tiver uma ou mais colunas FILESTREAM
, a tabela deverá ter uma coluna ROWGUIDCOL
.
CREATE TABLE dbo.EmployeePhoto
(
EmployeeId INT NOT NULL PRIMARY KEY,
Photo VARBINARY (MAX) FILESTREAM NULL,
MyRowGuidColumn UNIQUEIDENTIFIER DEFAULT NEWID() ROWGUIDCOL NOT NULL UNIQUE
);
N. Criar uma tabela que usa compactação de linha
O exemplo a seguir cria uma tabela que usa compactação de linha.
CREATE TABLE dbo.T1
(
c1 INT,
c2 NVARCHAR (200)
)
WITH (DATA_COMPRESSION = ROW);
Para obter exemplos adicionais de compactação de dados, consulte de compactação de dados .
O. Criar uma tabela que usa compactação XML
Aplica-se a: SQL Server 2022 (16.x) e versões posteriores, Banco de Dados SQL do Azure e Instância Gerenciada SQL do Azure.
O exemplo a seguir cria uma tabela que usa compactação XML.
CREATE TABLE dbo.T1
(
c1 INT,
c2 XML
)
WITH (XML_COMPRESSION = ON);
P. Criar uma tabela com colunas esparsas e um conjunto de colunas
Os exemplos a seguir mostram como criar uma tabela que tem uma coluna esparsa e uma tabela que tem duas colunas esparsas e um conjunto de colunas. Os exemplos usam a sintaxe básica. Para obter exemplos mais complexos, consulte Usar colunas esparsas e Usar conjuntos de colunas.
Este exemplo cria uma tabela que tem uma coluna esparsa.
CREATE TABLE dbo.T1
(
c1 INT PRIMARY KEY,
c2 VARCHAR (50) SPARSE NULL
);
Este exemplo cria uma tabela que tem duas colunas esparsas e um conjunto de colunas chamado CSet
.
CREATE TABLE T1
(
c1 INT PRIMARY KEY,
c2 VARCHAR (50) SPARSE NULL,
c3 INT SPARSE NULL,
CSet XML COLUMN_SET FOR ALL_SPARSE_COLUMNS
);
Q. Criar uma tabela temporal baseada em disco com versão do sistema
Aplica-se a: SQL Server 2016 (13.x) e posterior e Banco de Dados SQL do Azure.
Os exemplos a seguir mostram como criar uma tabela temporal vinculada a uma nova tabela de histórico e como criar uma tabela temporal vinculada a uma tabela de histórico existente. A tabela temporal deve ter uma chave primária definida para ser habilitada para que a tabela seja habilitada para controle de versão do sistema. Para obter exemplos mostrando como adicionar ou remover o controle de versão do sistema em uma tabela existente, consulte Controle de versão do sistema em Exemplos. Para casos de uso, consulte Tabelas Temporais.
Este exemplo cria uma nova tabela temporal vinculada a uma nova tabela de histórico.
CREATE TABLE Department
(
DepartmentNumber CHAR (10) NOT NULL PRIMARY KEY CLUSTERED,
DepartmentName VARCHAR (50) NOT NULL,
ManagerID INT NULL,
ParentDepartmentNumber CHAR (10) NULL,
ValidFrom DATETIME2 GENERATED ALWAYS AS ROW START HIDDEN NOT NULL,
ValidTo DATETIME2 GENERATED ALWAYS AS ROW END HIDDEN NOT NULL,
PERIOD FOR SYSTEM_TIME (ValidFrom, ValidTo)
)
WITH (SYSTEM_VERSIONING = ON);
Este exemplo cria uma nova tabela temporal vinculada a uma tabela de histórico existente.
-- Existing table
CREATE TABLE Department_History
(
DepartmentNumber CHAR (10) NOT NULL,
DepartmentName VARCHAR (50) NOT NULL,
ManagerID INT NULL,
ParentDepartmentNumber CHAR (10) NULL,
ValidFrom DATETIME2 NOT NULL,
ValidTo DATETIME2 NOT NULL
);
-- Temporal table
CREATE TABLE Department
(
DepartmentNumber CHAR (10) NOT NULL PRIMARY KEY CLUSTERED,
DepartmentName VARCHAR (50) NOT NULL,
ManagerID INT NULL,
ParentDepartmentNumber CHAR (10) NULL,
ValidFrom DATETIME2 GENERATED ALWAYS AS ROW START HIDDEN NOT NULL,
ValidTo DATETIME2 GENERATED ALWAYS AS ROW END HIDDEN NOT NULL,
PERIOD FOR SYSTEM_TIME (ValidFrom, ValidTo)
)
WITH (SYSTEM_VERSIONING = ON (HISTORY_TABLE=dbo.Department_History, DATA_CONSISTENCY_CHECK=ON));
R. Criar uma tabela temporal com versão do sistema otimizada para memória
Aplica-se a: SQL Server 2016 (13.x) e posterior e Banco de Dados SQL do Azure.
O exemplo a seguir mostra como criar uma tabela temporal com versão do sistema otimizada para memória vinculada a uma nova tabela de histórico baseada em disco.
Este exemplo cria uma nova tabela temporal vinculada a uma nova tabela de histórico.
CREATE SCHEMA History;
GO
CREATE TABLE dbo.Department
(
DepartmentNumber CHAR (10) NOT NULL PRIMARY KEY NONCLUSTERED,
DepartmentName VARCHAR (50) NOT NULL,
ManagerID INT NULL,
ParentDepartmentNumber CHAR (10) NULL,
ValidFrom DATETIME2 GENERATED ALWAYS AS ROW START HIDDEN NOT NULL,
ValidTo DATETIME2 GENERATED ALWAYS AS ROW END HIDDEN NOT NULL,
PERIOD FOR SYSTEM_TIME (ValidFrom, ValidTo)
)
WITH (MEMORY_OPTIMIZED = ON, DURABILITY = SCHEMA_AND_DATA, SYSTEM_VERSIONING = ON (HISTORY_TABLE=History.DepartmentHistory));
Este exemplo cria uma nova tabela temporal vinculada a uma tabela de histórico existente.
-- Existing table
CREATE TABLE Department_History
(
DepartmentNumber CHAR (10) NOT NULL,
DepartmentName VARCHAR (50) NOT NULL,
ManagerID INT NULL,
ParentDepartmentNumber CHAR (10) NULL,
ValidFrom DATETIME2 NOT NULL,
ValidTo DATETIME2 NOT NULL
);
-- Temporal table
CREATE TABLE Department
(
DepartmentNumber CHAR (10) NOT NULL PRIMARY KEY CLUSTERED,
DepartmentName VARCHAR (50) NOT NULL,
ManagerID INT NULL,
ParentDepartmentNumber CHAR (10) NULL,
ValidFrom DATETIME2 GENERATED ALWAYS AS ROW START HIDDEN NOT NULL,
ValidTo DATETIME2 GENERATED ALWAYS AS ROW END HIDDEN NOT NULL,
PERIOD FOR SYSTEM_TIME (ValidFrom, ValidTo)
)
WITH (SYSTEM_VERSIONING = ON (HISTORY_TABLE=dbo.Department_History, DATA_CONSISTENCY_CHECK=ON));
S. Criar uma tabela com colunas encriptadas
O exemplo a seguir cria uma tabela com duas colunas criptografadas. Para obter mais informações, consulte Always Encrypted.
CREATE TABLE Customers
(
CustName NVARCHAR (60) ENCRYPTED WITH (
COLUMN_ENCRYPTION_KEY = MyCEK,
ENCRYPTION_TYPE = RANDOMIZED,
ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256'
),
SSN VARCHAR (11) COLLATE Latin1_General_BIN2 ENCRYPTED WITH (
COLUMN_ENCRYPTION_KEY = MyCEK,
ENCRYPTION_TYPE = DETERMINISTIC,
ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256'
),
Age INT NULL
);
T. Criar um índice filtrado embutido
Cria uma tabela com um índice filtrado embutido.
CREATE TABLE t1
(
c1 INT,
INDEX IX1 (c1) WHERE c1 > 0
);
U. Criar um índice embutido
A seguir mostra como usar NONCLUSTERED inline para tabelas baseadas em disco:
CREATE TABLE t1
(
c1 INT,
INDEX ix_1 NONCLUSTERED (c1)
);
CREATE TABLE t2
(
c1 INT,
c2 INT INDEX ix_1 NONCLUSTERED
);
CREATE TABLE t3
(
c1 INT,
c2 INT,
INDEX ix_1 NONCLUSTERED (c1, c2)
);
V. Criar uma tabela temporária com uma chave primária composta nomeada anonimamente
Cria uma tabela com uma chave primária composta nomeada anonimamente. Isso é útil para evitar conflitos em tempo de execução em que duas tabelas temporárias com escopo de sessão, cada uma em uma sessão separada, usam o mesmo nome para uma restrição.
CREATE TABLE #tmp
(
c1 INT,
c2 INT,
PRIMARY KEY CLUSTERED ([c1], [c2])
);
GO
Se você nomear explicitamente a restrição, a segunda sessão gerará um erro como:
Msg 2714, Level 16, State 5, Line 1
There is already an object named 'PK_#tmp' in the database.
Msg 1750, Level 16, State 1, Line 1
Could not create constraint or index. See previous errors.
O problema surge do fato de que, embora o nome da tabela temporária seja exclusivo, os nomes de restrição não são.
W. Usar tabelas temporárias globais no Banco de Dados SQL do Azure
A Sessão A cria uma tabela temporária global ##test no Banco de Dados SQL do Azure testdb1 e adiciona uma linha
CREATE TABLE ##test
(
a INT,
b INT
);
INSERT INTO ##test
VALUES (1, 1);
-- Obtain object ID for temp table ##test
SELECT OBJECT_ID('tempdb.dbo.##test') AS 'Object ID';
Aqui está o conjunto de resultados.
1253579504
Obter o nome da tabela temporária global para um determinado objeto ID 1253579504 no tempdb
(2)
SELECT name
FROM tempdb.sys.objects
WHERE object_id = 1253579504;
Aqui está o conjunto de resultados.
##test
A sessão B se conecta ao Banco de Dados SQL do Azure testdb1 e pode acessar a tabela ##test criada pela sessão A
SELECT *
FROM ##test;
Aqui está o conjunto de resultados.
1, 1
A sessão C se conecta a outro banco de dados no Banco de Dados SQL do Azure testdb2 e deseja acessar ##test criado em testdb1. Esta seleção falha devido ao escopo do banco de dados para as tabelas temporárias globais
SELECT *
FROM ##test;
O que gera o seguinte erro:
Msg 208, Level 16, State 0, Line 1
Invalid object name '##test'
Endereçando objeto do sistema no Banco de Dados SQL do Azure tempdb
do banco de dados de usuário atual testdb1
SELECT *
FROM tempdb.sys.objects;
SELECT *
FROM tempdb.sys.columns;
SELECT *
FROM tempdb.sys.database_files;
X. Habilitar a Política de Retenção de Dados em uma tabela
O exemplo a seguir cria uma tabela com a retenção de dados habilitada e um período de retenção de uma semana. Este exemplo se aplica apenas ao do Azure SQL Edge.
CREATE TABLE [dbo].[data_retention_table]
(
[dbdatetime2] DATETIME2 (7),
[product_code] INT,
[value] CHAR (10)
)
WITH (DATA_DELETION = ON ( FILTER_COLUMN = [dbdatetime2], RETENTION_PERIOD = 1 WEEKS ) );
Y. Criar uma tabela contábil atualizável
O exemplo a seguir cria uma tabela contábil atualizável que não é uma tabela temporal com uma tabela de histórico anônima (o sistema gerará o nome da tabela de histórico) e o nome da exibição do razão gerada. Como os nomes das colunas geradas sempre necessárias e as colunas adicionais na visualização contábil não são especificados, as colunas terão os nomes padrão.
CREATE SCHEMA [HR];
GO
CREATE TABLE [HR].[Employees]
(
EmployeeID INT NOT NULL,
Salary MONEY NOT NULL
)
WITH (SYSTEM_VERSIONING = ON, LEDGER = ON);
GO
O exemplo a seguir cria uma tabela que é tanto uma tabela temporal quanto uma tabela contábil atualizável, com uma tabela de histórico anônima (com um nome gerado pelo sistema), o nome da exibição do razão gerado e os nomes padrão das colunas sempre geradas e das colunas de exibição do razão adicionais.
CREATE SCHEMA [HR];
GO
CREATE TABLE [HR].[Employees]
(
EmployeeID INT NOT NULL PRIMARY KEY,
Salary MONEY NOT NULL,
ValidFrom DATETIME2 GENERATED ALWAYS AS ROW START HIDDEN NOT NULL,
ValidTo DATETIME2 GENERATED ALWAYS AS ROW END HIDDEN NOT NULL,
PERIOD FOR SYSTEM_TIME (ValidFrom, ValidTo)
)
WITH (SYSTEM_VERSIONING = ON, LEDGER = ON);
GO
O exemplo a seguir cria uma tabela que é uma tabela temporal e uma tabela contábil atualizável com a tabela de histórico explicitamente nomeada, o nome especificado pelo usuário da exibição do razão e os nomes especificados pelo usuário das colunas sempre geradas e colunas adicionais na exibição do livro-razão.
CREATE SCHEMA [HR];
GO
CREATE TABLE [HR].[Employees]
(
EmployeeID INT NOT NULL PRIMARY KEY,
Salary MONEY NOT NULL,
StartTransactionId BIGINT GENERATED ALWAYS AS TRANSACTION_ID START HIDDEN NOT NULL,
EndTransactionId BIGINT GENERATED ALWAYS AS TRANSACTION_ID END HIDDEN NULL,
StartSequenceNumber BIGINT GENERATED ALWAYS AS SEQUENCE_NUMBER START HIDDEN NOT NULL,
EndSequenceNumber BIGINT GENERATED ALWAYS AS SEQUENCE_NUMBER END HIDDEN NULL,
ValidFrom DATETIME2 GENERATED ALWAYS AS ROW START HIDDEN NOT NULL,
ValidTo DATETIME2 GENERATED ALWAYS AS ROW END HIDDEN NOT NULL,
PERIOD FOR SYSTEM_TIME (ValidFrom, ValidTo)
)
WITH (SYSTEM_VERSIONING = ON (HISTORY_TABLE=[HR].[EmployeesHistory]), LEDGER = ON (LEDGER_VIEW=[HR].[EmployeesLedger] (TRANSACTION_ID_COLUMN_NAME=TransactionId,SEQUENCE_NUMBER_COLUMN_NAME=SequenceNumber,OPERATION_TYPE_COLUMN_NAME=OperationId,OPERATION_TYPE_DESC_COLUMN_NAME=OperationTypeDescription)));
GO
O exemplo a seguir cria uma tabela contábil somente acréscimo com os nomes gerados da exibição contábil e as colunas na exibição contábil.
CREATE SCHEMA [AccessControl];
GO
CREATE TABLE [AccessControl].[KeyCardEvents]
(
EmployeeID INT NOT NULL,
AccessOperationDescription NVARCHAR (MAX) NOT NULL,
[Timestamp] DATETIME2 NOT NULL,
StartTransactionId BIGINT GENERATED ALWAYS AS TRANSACTION_ID START HIDDEN NOT NULL,
StartSequenceNumber BIGINT GENERATED ALWAYS AS SEQUENCE_NUMBER START HIDDEN NOT NULL
)
WITH (LEDGER = ON (LEDGER_VIEW=[AccessControl].[KeyCardEventsLedger] (TRANSACTION_ID_COLUMN_NAME=TransactionId,SEQUENCE_NUMBER_COLUMN_NAME=SequenceNumber,OPERATION_TYPE_COLUMN_NAME=OperationId,OPERATION_TYPE_DESC_COLUMN_NAME=OperationTypeDescription),APPEND_ONLY= ON));
GO
O exemplo a seguir cria um banco de dados contábil no Banco de Dados SQL do Azure e uma tabela contábil atualizável usando as configurações padrão. A criação de uma tabela contábil atualizável em um banco de dados contábil não requer o uso WITH (SYSTEM_VERSIONING = ON, LEDGER = ON);
.
CREATE DATABASE MyLedgerDB
(EDITION = 'GeneralPurpose')
WITH LEDGER = ON;
GO
CREATE SCHEMA [HR];
GO
CREATE TABLE [HR].[Employees]
(
EmployeeID INT NOT NULL,
Salary MONEY NOT NULL
);
GO