SnowConvert AI - Servidor SQL - Azure Synapse - ALTER

Referência de tradução para todas as instruções DDL que são precedidas pela palavra-chave ALTER.

TABLE

Descrição

Modifica a definição de uma tabela alterando, adicionando ou eliminando colunas e restrições. ALTER TABLE também reatribui e reconstrói partições, ou desativa e ativa restrições e acionadores. (https://docs.microsoft.com/en-us/sql/t-sql/statements/alter-table-transact-sql)

CHECK CONSTRAINT

Applies to
  • SQL Server

  • Azure Synapse Analytics

Descrição

Nota

Algumas partes do código de saída foram omitidas por motivos de clareza.

SnowConvert AI comments out ALTER TABLE ... CHECK CONSTRAINT ... and ALTER TABLE ... NOCHECK CONSTRAINT ... statements because enabling or disabling constraints is not applicable in Snowflake.

This behavior applies to the CHECK CONSTRAINT action. It does not apply to unsupported ADD CHECK (...) constraint definitions, which continue to be flagged separately.

Amostra de padrões da origem

SQL Server

ALTER TABLE
    [Person].[EmailAddress] CHECK CONSTRAINT [FK_EmailAddress_Person_BusinessEntityID]
GO

Snowflake

----** SSC-FDM-TS0054 - CHECK CONSTRAINT STATEMENT REMOVED, ENABLING/DISABLING CONSTRAINTS IS NOT APPLICABLE IN SNOWFLAKE **
--ALTER TABLE IF EXISTS Person.EmailAddress CHECK CONSTRAINT FK_EmailAddress_Person_BusinessEntityID;

Known Limitations

  • Snowflake constraints are informational only, so SQL Server workflows that depend on enabling or disabling constraints must be redesigned manually.

  • This section only covers the CHECK CONSTRAINT action. Unsupported CHECK constraint definitions may still emit SSC-EWI-0035.

ADD

Descrição

Nota

No SQL Server, a cláusula ADD permite múltiplas ações por ADD, enquanto o Snowflake só permite uma sequência de ações de coluna ADD. Consequentemente, o SnowConvert AI divide a cláusula ALTER TABLE ADD em instruções individuais ALTER TABLE.

Há um subconjunto de funcionalidades fornecidas pela palavra-chave ADD, que permite a adição de diferentes elementos à tabela de destino. Isso inclui:

  • Definição de coluna

  • Definição de coluna computada

  • Restrição de tabela

  • Definição do conjunto de colunas

TABLE CONSTRAINT

Applies to
  • SQL Server

Nota

Algumas partes do código de saída foram omitidas por motivos de clareza.

Descrição

Especifica as propriedades de uma restrição PRIMARY KEY, FOREIGN KEY, UNIQUE ou CHECK que faz parte de uma nova definição de coluna adicionada a uma tabela usando ALTER TABLE. (https://docs.microsoft.com/en-us/sql/t-sql/statements/alter-table-column-constraint-transact-sql)

A conversão de restrições de coluna é relativamente simples. Há várias partes da sintaxe que não são necessárias ou não são compatíveis com o Snowflake.

Essas partes incluem:

  • CLUSTERED | NONCLUSTERED

  • WITH FILLFACTOR = fillfactor

  • WITH ( index_option [, ...n ] )

  • ON { partition_scheme_name ( partition\_column\_name ) | filegroup | "default" }

  • NOT FOR REPLICATION

  • CHECK [ NOT FOR REPLICATION ]

Sintaxe no SQL Server

 [ CONSTRAINT constraint_name ]   
{   
    { PRIMARY KEY | UNIQUE }   
        [ CLUSTERED | NONCLUSTERED ]   
        (column [ ASC | DESC ] [ ,...n ] )  
        [ WITH FILLFACTOR = fillfactor   
        [ WITH ( <index_option>[ , ...n ] ) ]  
        [ ON { partition_scheme_name ( partition_column_name ... )  | filegroup | "default" } ]   
    | FOREIGN KEY   
        ( column [ ,...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 ]   
    | CONNECTION
        ( { node_table TO node_table } 
          [ , {node_table TO node_table }]
          [ , ...n ]
        )
        [ ON DELETE { NO ACTION | CASCADE } ]
    | DEFAULT constant_expression FOR column [ WITH VALUES ]   
    | CHECK [ NOT FOR REPLICATION ] ( logical_expression )  
}

Sintaxe em Snowflake

 inlineUniquePK ::=
  [ CONSTRAINT <constraint_name> ]
  { UNIQUE | PRIMARY KEY }
  [ [ NOT ] ENFORCED ]
  [ [ NOT ] DEFERRABLE ]
  [ INITIALLY { DEFERRED | IMMEDIATE } ]
  [ ENABLE | DISABLE ]
  [ VALIDATE | NOVALIDATE ]
  [ RELY | NORELY ]

 [ CONSTRAINT <constraint_name> ]
  { UNIQUE | PRIMARY KEY }
  [ [ NOT ] ENFORCED ]
  [ [ NOT ] DEFERRABLE ]
  [ INITIALLY { DEFERRED | IMMEDIATE } ]
  [ ENABLE | DISABLE ]
  [ VALIDATE | NOVALIDATE ]
  [ RELY | NORELY ]

Amostra de padrões da origem

Várias instâncias de ALTER TABLE

SQL Server
 -- PRIMARY KEY
ALTER TABLE
    [Person]
ADD
    CONSTRAINT [PK_EmailAddress_BusinessEntityID_EmailAddressID] PRIMARY KEY CLUSTERED (
        [BusinessEntityID] ASC,
        [EmailAddressID] ASC
    ) ON [PRIMARY]
GO

-- FOREING KEY TO ANOTHER TABLE
ALTER TABLE
    [Person].[EmailAddress] WITH CHECK
ADD
    CONSTRAINT [FK_EmailAddress_Person_BusinessEntityID] FOREIGN KEY([BusinessEntityID]) REFERENCES [Person].[Person] ([BusinessEntityID]) ON DELETE CASCADE
GO
Snowflake
 -- PRIMARY KEY
ALTER TABLE Person
ADD
    CONSTRAINT PK_EmailAddress_BusinessEntityID_EmailAddressID PRIMARY KEY (BusinessEntityID, EmailAddressID);

-- FOREING KEY TO ANOTHER TABLE
ALTER TABLE Person.EmailAddress
!!!RESOLVE EWI!!! /*** SSC-EWI-0035 - CHECK STATEMENT NOT SUPPORTED ***/!!!
WITH CHECK
ADD
    CONSTRAINT FK_EmailAddress_Person_BusinessEntityID FOREIGN KEY(BusinessEntityID) REFERENCES Person.Person (BusinessEntityID) ON DELETE CASCADE ;

DEFAULT dentro de restrições

SQL Server
CREATE TABLE Table1
(
   COL_VARCHAR VARCHAR,
   COL_INT INT,
   COL_DATE DATE
);

ALTER TABLE
    Table1
ADD
    CONSTRAINT [DF_Table1_COL_INT] DEFAULT ((0)) FOR [COL_INT]
GO

ALTER TABLE
    Table1
ADD
    COL_NEWCOLUMN VARCHAR,
    CONSTRAINT [DF_Table1_COL_VARCHAR] DEFAULT ('NOT DEFINED') FOR [COL_VARCHAR]
GO

ALTER TABLE
    Table1
ADD
    CONSTRAINT [DF_Table1_COL_DATE] DEFAULT (getdate()) FOR [COL_DATE]    
GO
Snowflake
CREATE OR REPLACE TABLE Table1 (
   COL_VARCHAR VARCHAR DEFAULT ('NOT DEFINED'),
   COL_INT INT DEFAULT ((0)),
   COL_DATE DATE DEFAULT (CURRENT_TIMESTAMP() :: TIMESTAMP)
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"transact"}}'
;

----** SSC-FDM-TS0020 - DEFAULT CONSTRAINT MAY HAVE BEEN ADDED TO TABLE DEFINITION **

--ALTER TABLE Table1
--ADD
--    CONSTRAINT DF_Table1_COL_INT DEFAULT ((0)) FOR COL_INT
                                                          ;

ALTER TABLE Table1
ADD COL_NEWCOLUMN VARCHAR;

----** SSC-FDM-TS0020 - DEFAULT CONSTRAINT MAY HAVE BEEN ADDED TO TABLE DEFINITION **

--ALTER TABLE Table1
--ADD
--CONSTRAINT DF_Table1_COL_VARCHAR DEFAULT ('NOT DEFINED') FOR COL_VARCHAR
                                                                        ;

----** SSC-FDM-TS0020 - DEFAULT CONSTRAINT MAY HAVE BEEN ADDED TO TABLE DEFINITION **

--ALTER TABLE Table1
--ADD
--    CONSTRAINT DF_Table1_COL_DATE DEFAULT (CURRENT_TIMESTAMP() :: TIMESTAMP) FOR COL_DATE
                                                                                         ;

Problemas conhecidos

1. DEFAULT só é suportado em CREATE TABLE e ALTER TABLE ... ADD COLUMN

SQL Server supports defining a DEFAULT property within a constraint, while Snowflake only allows that when adding the column through CREATE TABLE or ALTER TABLE ... ADD COLUMN. DEFAULT properties within the ADD CONSTRAINT syntax are not supported and will be translated to ALTER TABLE ALTER COLUMN.

CHECK

Applies to
  • SQL Server

Descrição

Nota

Algumas partes do código de saída foram omitidas por motivos de clareza.

When CHECK clause is in the ALTER statement, SnowConvert AI will comment out the entire statement, since it is not supported.

Amostra de padrões da origem

SQL Server

ALTER TABLE dbo.doc_exd    
ADD CONSTRAINT exd_check CHECK NOT FOR REPLICATION (column_a > 1); 

Snowflake

!!!RESOLVE EWI!!! /*** SSC-EWI-0035 - CHECK STATEMENT NOT SUPPORTED ***/!!!
ALTER TABLE dbo.doc_exd
ADD CONSTRAINT exd_check CHECK NOT FOR REPLICATION (column_a > 1);

Problemas conhecidos

1. A cláusula ALTER TABLE CHECK não é compatível com o Snowflake.

Toda a cláusula ALTER TABLE CHECK é comentada, pois não é compatível com o Snowflake.

EWIs relacionados

CONNECTION

Applies to
  • SQL Server

Descrição

Nota

Algumas partes do código de saída foram omitidas por motivos de clareza.

Quando a cláusula CONNECTION está na instrução ALTER, o SnowConvert AI comenta a instrução inteira, pois não é compatível.

Amostra de padrões da origem

SQL Server

ALTER TABLE bought 
ADD COL2 VARCHAR(32), CONSTRAINT EC_BOUGHT1 CONNECTION (Customer TO Product, Supplier TO Product) 
ON DELETE NO ACTION;

Snowflake

ALTER TABLE bought
ADD COL2 VARCHAR(32);

!!!RESOLVE EWI!!! /*** SSC-EWI-0109 - ALTER TABLE SYNTAX NOT APPLICABLE IN SNOWFLAKE ***/!!!
ALTER TABLE bought
ADD
CONSTRAINT EC_BOUGHT1 CONNECTION (Customer TO Product, Supplier TO Product)
ON DELETE NO ACTION;

Problemas conhecidos

1. A cláusula ALTER TABLE CONNECTION não é compatível com o Snowflake.

Toda a cláusula ALTER TABLE CONNECTION é comentada, pois não é compatível com o Snowflake.

EWIs relacionados

  • SSC-EWI-0109: A sintaxe Alter Table não é aplicável no Snowflake.

DEFAULT

Applies to
  • SQL Server

Descrição

Quando a cláusula DEFAULT está na instrução ALTER, o SnowConvert AI comenta a instrução inteira, pois não é compatível.

O único cenário funcional ocorre quando a definição da tabela está no mesmo arquivo; dessa forma, o padrão é adicionado na definição da coluna.

Amostra de padrões da origem

SQL Server

CREATE TABLE table1
(
  col1 integer not null,
  col2 varchar collate Latin1_General_CS,
  col3 date not null
)

ALTER TABLE table1
ADD CONSTRAINT col1_constraint DEFAULT 50 FOR col1;

ALTER TABLE table1
ADD CONSTRAINT col2_constraint DEFAULT 'hello world' FOR col2;

ALTER TABLE table1
ADD CONSTRAINT col3_constraint DEFAULT getdate() FOR col3;

Snowflake

CREATE OR REPLACE TABLE table1 (
  col1 INTEGER not null DEFAULT 50,
  col2 VARCHAR COLLATE 'EN-CS' DEFAULT 'hello world',
  col3 DATE not null DEFAULT CURRENT_TIMESTAMP() :: TIMESTAMP
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"transact"}}'
;

----** SSC-FDM-TS0020 - DEFAULT CONSTRAINT MAY HAVE BEEN ADDED TO TABLE DEFINITION **

--ALTER TABLE table1
--ADD CONSTRAINT col1_constraint DEFAULT 50 FOR col1
                                                  ;

----** SSC-FDM-TS0020 - DEFAULT CONSTRAINT MAY HAVE BEEN ADDED TO TABLE DEFINITION **

--ALTER TABLE table1
--ADD CONSTRAINT col2_constraint DEFAULT 'hello world' FOR col2
                                                             ;

----** SSC-FDM-TS0020 - DEFAULT CONSTRAINT MAY HAVE BEEN ADDED TO TABLE DEFINITION **

--ALTER TABLE table1
--ADD CONSTRAINT col3_constraint DEFAULT CURRENT_TIMESTAMP() :: TIMESTAMP FOR col3
                                                                                ;

Problemas conhecidos

1. A cláusula ALTER TABLE DEFAULT não é compatível com o Snowflake.

Toda a cláusula ALTER TABLE DEFAULT é comentada, pois não é compatível com o Snowflake.

EWIs relacionados

  1. SSC-FDM-TS0020: A restrição padrão foi comentada e pode ter sido adicionada a uma definição de tabela.

FOREIGN KEY

Applies to
  • SQL Server

Descrição

Nota

Algumas partes do código de saída foram omitidas por motivos de clareza.

O Snowflake suporta a gramática para restrições de integridade referencial e suas propriedades para facilitar a migração de outros bancos de dados.

SQL Server

FOREIGN KEY   
        ( column [ ,...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 ]

Snowflake

  [ FOREIGN KEY ]
  REFERENCES <ref_table_name> [ ( <ref_col_name> ) ]
  [ MATCH { FULL | SIMPLE | PARTIAL } ]
  [ ON [ UPDATE { CASCADE | SET NULL | SET DEFAULT | RESTRICT | NO ACTION } ]
       [ DELETE { CASCADE | SET NULL | SET DEFAULT | RESTRICT | NO ACTION } ] ]
  [ [ NOT ] ENFORCED ]
  [ [ NOT ] DEFERRABLE ]
  [ INITIALLY { DEFERRED | IMMEDIATE } ]
  [ ENABLE | DISABLE ]
  [ VALIDATE | NOVALIDATE ]
  [ RELY | NORELY ]

Amostra de padrões da origem

SQL Server

ALTER TABLE [Tests].[dbo].[Employee]
ADD CONSTRAINT FK_Department FOREIGN KEY(DepartmentID) REFERENCES Department(DepartmentID) 
ON UPDATE CASCADE
ON DELETE NO ACTION
NOT FOR REPLICATION;

Snowflake

ALTER TABLE Tests.dbo.Employee
ADD CONSTRAINT FK_Department FOREIGN KEY(DepartmentID) REFERENCES Department (DepartmentID)
ON UPDATE CASCADE
ON DELETE NO ACTION;

Nota

As restrições não são aplicadas no Snowflake, com exceção de NOT NULL.

As chaves primária e estrangeira são usadas apenas para fins de documentação, mais do que para restrições de design.

ON PARTITION

Applies to
  • SQL Server

Nota

Instrução não relevante.

Aviso

Observe que esta instrução é removida da migração porque é uma sintaxe não relevante. Isso significa que não é necessário no Snowflake.

Descrição

Nota

Algumas partes do código de saída foram omitidas por motivos de clareza.

In Transact SQL Server, the on partition statement is used inside alter statements and is used to divide the data across the database. For more information, see the SQL Server partitioned tables and indexes documentation.

Amostra de padrões da origem

On Partition

Observe que, neste exemplo, ON PARTITION foi removido. Isso ocorre porque o Snowflake oferece uma metodologia de particionamento integrada. Portanto, a sintaxe não é relevante.

SQL SERVER
ALTER TABLE table_name
ADD column_name INTEGER
CONSTRAINT constraint_name UNIQUE
ON partition_scheme_name (partition_column_name);
Snowflake
ALTER TABLE table_name
ADD column_name INTEGER
CONSTRAINT constraint_name UNIQUE;

PRIMARY KEY

Applies to
  • SQL Server

Descrição

Nota

Algumas partes do código de saída foram omitidas por motivos de clareza.

A chave primária do SQL Server tem muitas cláusulas que não são aplicáveis ao Snowflake. Portanto, a maior parte da instrução será comentada.

Sintaxe no SQL Server

{ PRIMARY KEY | UNIQUE }   
[ CLUSTERED | NONCLUSTERED ]   
(column [ ASC | DESC ] [ ,...n ] )  
[ WITH FILLFACTOR = fillfactor   
[ WITH ( <index_option>[ , ...n ] ) ]  
[ ON { partition_scheme_name ( partition_column_name ... )  | filegroup | "default" } ]   

Sintaxe no Snowflake

[ CONSTRAINT <constraint_name> ]
{ UNIQUE | PRIMARY KEY } ( <col_name> [ , <col_name> , ... ] )
[ [ NOT ] ENFORCED ]
[ [ NOT ] DEFERRABLE ]
[ INITIALLY { DEFERRED | IMMEDIATE } ]
[ ENABLE | DISABLE ]
[ VALIDATE | NOVALIDATE ]
[ RELY | NORELY ]

Amostra de padrões da origem

Aviso

Observe que a instrução WITH FILLFACTOR foi removida da conversão porque não é relevante na sintaxe do Snowflake.

SQL Server

ALTER TABLE Production.TransactionHistoryArchive
   ADD CONSTRAINT PK_TransactionHistoryArchive_TransactionID PRIMARY KEY 
   CLUSTERED (TransactionID)
   WITH (FILLFACTOR = 75, ONLINE = ON, PAD_INDEX = ON)
   ON "DEFAULTLOCATION";

Snowflake

ALTER TABLE Production.TransactionHistoryArchive
   ADD CONSTRAINT PK_TransactionHistoryArchive_TransactionID PRIMARY KEY (TransactionID);

COLUMN DEFINITION

ALTER TABLE ADD column_name

Applies to
  • SQL Server

  • Azure Synapse Analytics

Nota

Algumas partes do código de saída foram omitidas por motivos de clareza.

Descrição

Especifica as propriedades de uma coluna que são adicionadas a uma tabela usando ALTER TABLE.

A adição de uma definição de coluna no Snowflake tem algumas diferenças em relação ao SQL Server.

Por exemplo, várias partes da gramática do SQL Server não são necessárias ou não são totalmente compatíveis com o Snowflake. Isso inclui:

Additionally, a couple other parts are partially supported, and require additional work to be implemented to properly emulate the original functionality. Specifically, we’re talking about the MASKED WITH property, which will be covered in the patterns section of this page.

SQL Server

column_name <data_type>  
[ FILESTREAM ]  
[ COLLATE collation_name ]   
[ NULL | NOT NULL ]  
[
    [ CONSTRAINT constraint_name ] DEFAULT constant_expression [ WITH VALUES ]   
    | IDENTITY [ ( seed , increment ) ] [ NOT FOR REPLICATION ]   
]
[ ROWGUIDCOL ]   
[ SPARSE ]   
[ ENCRYPTED WITH  
  ( COLUMN_ENCRYPTION_KEY = key_name ,  
      ENCRYPTION_TYPE = { DETERMINISTIC | RANDOMIZED } ,   
      ALGORITHM =  'AEAD_AES_256_CBC_HMAC_SHA_256'   
  ) ]  
[ MASKED WITH ( FUNCTION = ' mask_function ') ]  
[ <column_constraint> [ ...n ] ]  

Snowflake

ADD [ COLUMN ] <col_name> <col_type>
        [ { DEFAULT <expr> | { AUTOINCREMENT | IDENTITY } [ { ( <start_num> , <step_num> ) | START <num> INCREMENT <num> } ] } ]
                            /* AUTOINCREMENT (or IDENTITY) supported only for columns with numeric data types (NUMBER, INT, FLOAT, etc.). */
                            /* Also, if the table is not empty (i.e. rows exist in the table), only DEFAULT can be altered.               */
        [ inlineConstraint ]
        [ [ WITH ] MASKING POLICY <policy_name> [ USING ( <col1_name> , cond_col_1 , ... ) ] ]

Amostra de padrões da origem

Padrão básico

Esse padrão mostra a remoção de elementos de ALTER TABLE original.

SQL Server
ALTER TABLE table_name
ADD column_name INTEGER;
Snowflake
ALTER TABLE IF EXISTS table_name
ADD column_name INTEGER;

COLLATE

O agrupamento permite que você especifique regras mais amplas ao falar sobre comparação de cadeias de caracteres.

SQL Server
ALTER TABLE table_name
ADD COLUMN new_column_name VARCHAR
COLLATE Latin1_General_CI_AS;

Como a nomenclatura da regra de agrupamento varia do SQL Server para o Snowflake, é necessário fazer ajustes.

Snowflake
ALTER TABLE IF EXISTS table_name
ADD COLUMN new_column_name VARCHAR COLLATE 'EN-CI-AS' /*** SSC-PRF-0002 - CASE INSENSITIVE COLUMNS CAN DECREASE THE PERFORMANCE OF QUERIES ***/;

MASKED WITH

Este padrão mostra a tradução para a propriedade MASKED WITH. CREATE OR REPLACE MASKING POLICY é inserido em algum lugar antes do primeiro uso, e depois referenciado por uma cláusula SET MASKING POLICY.

O nome do novo MASKING POLICY será a concatenação do nome e argumentos do MASKED WITH FUNCTION original, como visto abaixo:

SQL Server
ALTER TABLE table_name
ALTER COLUMN column_name
ADD MASKED WITH ( FUNCTION = ' random(1, 999) ' );
Snowflake
--** SSC-FDM-TS0022 - MASKING ROLE MUST BE DEFINED PREVIOUSLY BY THE USER **
CREATE OR REPLACE MASKING POLICY "random_1_999" AS
(val SMALLINT)
RETURNS SMALLINT ->
CASE
WHEN current_role() IN ('YOUR_DEFINED_ROLE_HERE')
THEN val
ELSE UNIFORM(1, 999, RANDOM()) :: SMALLINT
END;

ALTER TABLE IF EXISTS table_name MODIFY COLUMN column_name/*** SSC-FDM-TS0021 - A MASKING POLICY WAS CREATED AS SUBSTITUTE FOR MASKED WITH ***/  SET MASKING POLICY "random_1_999";

DEFAULT

Esse padrão mostra alguns dos cenários básicos de conversão para a propriedade DEFAULT.

SQL Server
ALTER TABLE table_name
ADD intcol INTEGER DEFAULT 0;

ALTER TABLE table_name
ADD varcharcol VARCHAR(20) DEFAULT '';

ALTER TABLE table_name
ADD datecol DATE DEFAULT CURRENT_TIMESTAMP;
Snowflake
ALTER TABLE IF EXISTS table_name
ADD intcol INTEGER DEFAULT 0;

ALTER TABLE IF EXISTS table_name
ADD varcharcol VARCHAR(20) DEFAULT '';

ALTER TABLE IF EXISTS table_name
ADD datecol DATE
                 !!!RESOLVE EWI!!! /*** SSC-EWI-TS0078 - DEFAULT OPTION NOT ALLOWED IN SNOWFLAKE ***/!!!
                 DEFAULT CURRENT_TIMESTAMP;

ENCRYPTED WITH

Esse padrão mostra a conversão da propriedade ENCRYPTED WITH, que é comentada no código de saída.

SQL Server
ALTER TABLE table_name
ADD encryptedcol VARCHAR(20)
ENCRYPTED WITH  
  ( COLUMN_ENCRYPTION_KEY = key_name ,  
      ENCRYPTION_TYPE = RANDOMIZED ,  
      ALGORITHM =  'AEAD_AES_256_CBC_HMAC_SHA_256'  
  );
Snowflake
ALTER TABLE IF EXISTS table_name
ADD encryptedcol VARCHAR(20)
----** SSC-FDM-TS0009 - ENCRYPTED WITH NOT SUPPORTED IN SNOWFLAKE **
--ENCRYPTED WITH
--  ( COLUMN_ENCRYPTION_KEY = key_name ,
--      ENCRYPTION_TYPE = RANDOMIZED ,
--      ALGORITHM =  'AEAD_AES_256_CBC_HMAC_SHA_256'
--  )
   ;

NOT NULL

A cláusula SQL Server NOT NULL tem o mesmo padrão e funcionalidade que a cláusula do Snowflake NOT NULL

SQL Server
ALTER TABLE table2 ADD 
column_test INTEGER NOT NULL,
column_test2 INTEGER NULL,
column_test3 INTEGER;
Snowflake
ALTER TABLE IF EXISTS table2 ADD column_test INTEGER NOT NULL;

ALTER TABLE IF EXISTS table2 ADD column_test2 INTEGER NULL;

ALTER TABLE IF EXISTS table2 ADD column_test3 INTEGER;

IDENTITY

Esse padrão apresenta a conversão para IDENTITY. A parte NOT FOR REPLICATION é removida no Snowflake.

SQL Server
ALTER TABLE table3 ADD 
column_test INTEGER IDENTITY(1, 100) NOT FOR REPLICATION;
Snowflake
ALTER TABLE IF EXISTS table3 ADD column_test INTEGER IDENTITY(1, 100) ORDER;

Cláusulas sem suporte

FILESTREAM

O comportamento original do FILESTREAM não pode ser reproduzido no Snowflake e merece ser comentado em toda a instrução do ALTER TABLE.

SQL Server
ALTER TABLE table2
ADD column1 varbinary(max)
FILESTREAM;
Snowflake
ALTER TABLE IF EXISTS table2
ADD column1 VARBINARY
!!!RESOLVE EWI!!! /*** SSC-EWI-0040 - THE 'FILESTREAM COLUMN OPTION' CLAUSE IS NOT SUPPORTED IN SNOWFLAKE ***/!!!
FILESTREAM;

SPARSE

No SQL Server, SPARSE é usado para definir colunas que são otimizadas para o armazenamento NULL. No entanto, quando usamos o Snowflake, não precisamos usar essa cláusula.

O Snowflake realiza otimizações em tabelas automaticamente, o que reduz a necessidade de otimizações manuais feitas pelo usuário.

SQL Server
-- ADD COLUMN DEFINITION form
ALTER TABLE table3
ADD column1 int NULL SPARSE;

----------------------------------------
/* It also applies to the other forms */
----------------------------------------

-- CREATE TABLE form
CREATE TABLE table3
(
    column1 INT SPARSE NULL
);

-- ALTER COLUMN form
ALTER TABLE table3
ALTER COLUMN column1 INT NULL SPARSE;
Snowflake
-- ADD COLUMN DEFINITION form
ALTER TABLE IF EXISTS table3
ALTER COLUMN column1
                     !!!RESOLVE EWI!!! /*** SSC-EWI-TS0061 - ALTER COLUMN COMMENTED OUT BECAUSE SPARSE COLUMN IS NOT SUPPORTED IN SNOWFLAKE ***/!!!
                     INT NULL SPARSE;

----------------------------------------
/* It also applies to the other forms */
----------------------------------------

-- CREATE TABLE form
CREATE OR REPLACE TABLE table3
(
    column1 INT
                !!!RESOLVE EWI!!! /*** SSC-EWI-0040 - THE 'SPARSE COLUMN OPTION' CLAUSE IS NOT SUPPORTED IN SNOWFLAKE ***/!!!
                SPARSE NULL
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"transact"}}'
;

-- ALTER COLUMN form
ALTER TABLE IF EXISTS table3
ALTER COLUMN column1
                     !!!RESOLVE EWI!!! /*** SSC-EWI-TS0061 - ALTER COLUMN COMMENTED OUT BECAUSE SPARSE COLUMN IS NOT SUPPORTED IN SNOWFLAKE ***/!!!
                     INT NULL SPARSE;

ROWGUIDCOL

SQL Server
ALTER TABLE table_name
ADD column_name UNIQUEIDENTIFIER 
ROWGUIDCOL;
Snowflake
ALTER TABLE IF EXISTS table_name
ADD column_name VARCHAR
!!!RESOLVE EWI!!! /*** SSC-EWI-0040 - THE 'ROWGUIDCOL COLUMN OPTION' CLAUSE IS NOT SUPPORTED IN SNOWFLAKE ***/!!!
ROWGUIDCOL;

Problemas conhecidos

1. As funções e os usuários devem ser previamente configurados para as políticas de mascaramento

Snowflake’s Masking Policies can be applied to columns only after the policies were created. This requires the user to create the policies and assign them to roles, and these roles to users, to work properly. Masking Policies can behave differently depending on which user is querying.

Aviso

O SnowConvert AI não executa essa configuração automaticamente.

2. As políticas de mascaramento exigem uma conta Snowflake Enterprise ou superior.

The Snowflake documentation states that masking policies are available on Enterprise or higher rank accounts.

Nota

Para obter mais detalhes, acesse CREATE MASKING POLICY - Documentação do Snowflake.

3. DEFAULT suporta apenas valores constantes

A propriedade DEFAULT do SQL Server é parcialmente suportada pelo Snowflake, desde que seu valor associado seja uma constante.

4. A cláusula FILESTREAM não é compatível com o Snowflake.

Toda a cláusula FILESTSTREAM é comentada, pois não é compatível com o Snowflake.

5. A cláusula SPARSE não é compatível com o Snowflake.

Toda a cláusula SPARSE é comentada, pois não é compatível com o Snowflake. Quando ela é adicionada em uma instrução ALTER COLUMN e é a única modificação que está sendo feita na coluna, a instrução inteira é removida, pois não está mais adicionando nada.

EWIs relacionados

  1. SSC-EWI-0040: Instrução não suportada.

  2. SSC-EWI-TS0061: ALTER COLUMN não suportado.

  3. SSC-EWI-TS0078: O valor padrão não é permitido no Snowflake.

  4. SSC-FDM-TS0009: Encrypted with não suportado no Snowflake.

  5. SSC-FDM-TS0021: Um MASKING POLICY foi criado como substituto do MASKED WITH.

  6. SSC-FDM-TS0022: O usuário deve definir previamente a função de máscara.

  7. SSC-PRF-0002: Colunas que não diferenciam maiúsculas e minúsculas podem diminuir o desempenho das consultas.

COLUMN CONSTRAINT

ALTER TABLE ADD COLUMN … COLUMN CONSTRAINT

Applies to
  • SQL Server

  • Azure Synapse Analytics

Descrição

Especifica as propriedades de um PRIMARY KEY, FOREIGN KEY ou CHECK que faz parte de uma nova restrição de coluna adicionada a uma tabela usando Alter Table.

SQL Server

[ CONSTRAINT constraint_name ]   
{   
    [ NULL | NOT NULL ]   
    { PRIMARY KEY | UNIQUE }   
        [ CLUSTERED | NONCLUSTERED ]   
        [ 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 )  
}  

Snowflake

CREATE TABLE <name> ( <col1_name> <col1_type>    [ NOT NULL ] { inlineUniquePK | inlineFK }
                     [ , <col2_name> <col2_type> [ NOT NULL ] { inlineUniquePK | inlineFK } ]
                     [ , ... ] )

ALTER TABLE <name> ADD COLUMN <col_name> <col_type> [ NOT NULL ] { inlineUniquePK | inlineFK }

Onde:

inlineUniquePK ::=
  [ CONSTRAINT <constraint_name> ]
  { UNIQUE | PRIMARY KEY }
  [ [ NOT ] ENFORCED ]
  [ [ NOT ] DEFERRABLE ]
  [ INITIALLY { DEFERRED | IMMEDIATE } ]
  [ ENABLE | DISABLE ]
  [ VALIDATE | NOVALIDATE ]
  [ RELY | NORELY ]
inlineFK :=
  [ CONSTRAINT <constraint_name> ]
  [ FOREIGN KEY ]
  REFERENCES <ref_table_name> [ ( <ref_col_name> ) ]
  [ MATCH { FULL | SIMPLE | PARTIAL } ]
  [ ON [ UPDATE { CASCADE | SET NULL | SET DEFAULT | RESTRICT | NO ACTION } ]
       [ DELETE { CASCADE | SET NULL | SET DEFAULT | RESTRICT | NO ACTION } ] ]
  [ [ NOT ] ENFORCED ]
  [ [ NOT ] DEFERRABLE ]
  [ INITIALLY { DEFERRED | IMMEDIATE } ]
  [ ENABLE | DISABLE ]
  [ VALIDATE | NOVALIDATE ]
  [ RELY | NORELY ]

CHECK

Applies to
  • SQL Server

Descrição

Nota

Algumas partes do código de saída foram omitidas por motivos de clareza.

When CHECK clause is in the ALTER statement, SnowConvert AI will comment out the entire statement, since it is not supported.

Amostra de padrões da origem

SQL Server

ALTER TABLE table_name
ADD column_name VARCHAR(255) 
CONSTRAINT constraint_name 
CHECK NOT FOR REPLICATION (column_name > 1);

Snowflake

ALTER TABLE IF EXISTS table_name
ADD column_name VARCHAR(255)
!!!RESOLVE EWI!!! /*** SSC-EWI-0035 - CHECK STATEMENT NOT SUPPORTED ***/!!!
CONSTRAINT constraint_name
CHECK NOT FOR REPLICATION (column_name > 1);

Problemas conhecidos

1. A cláusula ALTER TABLE CHECK não é compatível com o Snowflake.

Toda a cláusula ALTER TABLE CHECK é comentada, pois não é compatível com o Snowflake.

EWIs relacionados

FOREIGN KEY

Applies to
  • SQL Server

  • Azure Synapse Analytics

Descrição

The syntax for the Foreign Key is fully supported by Snowflake, except for the [ NOT FOR REPLICATION ] and the WITH CHECK clauses.

SQL Server

Consulte a seguinte documentação do SQL Server para obter mais informações.

[ 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 ]

Snowflake

[ FOREIGN KEY ]
REFERENCES <ref_table_name> [ ( <ref_col_name> ) ]
[ MATCH { FULL | SIMPLE | PARTIAL } ]
[ ON [ UPDATE { CASCADE | SET NULL | SET DEFAULT | RESTRICT | NO ACTION } ]
     [ DELETE { CASCADE | SET NULL | SET DEFAULT | RESTRICT | NO ACTION } ] ]
[ [ NOT ] ENFORCED ]
[ [ NOT ] DEFERRABLE ]
[ INITIALLY { DEFERRED | IMMEDIATE } ]
[ ENABLE | DISABLE ]
[ VALIDATE | NOVALIDATE ]
[ RELY | NORELY ]

Amostra de padrões da origem

Caso geral

SQL Server
ALTER TABLE dbo.student 
ADD CONSTRAINT Fk_empid FOREIGN KEY(emp_id)
REFERENCES dbo.emp(id);

ALTER TABLE dbo.student 
ADD CONSTRAINT Fk_empid FOREIGN KEY(emp_id)
REFERENCES dbo.emp(id)
NOT FOR REPLICATION;
Snowflake
ALTER TABLE dbo.student
ADD CONSTRAINT Fk_empid FOREIGN KEY(emp_id)
REFERENCES dbo.emp (id);

ALTER TABLE dbo.student
ADD CONSTRAINT Fk_empid FOREIGN KEY(emp_id)
REFERENCES dbo.emp (id);

Caso WITH CHECK / NO CHECK

Observe que a lógica do Snowflake não suporta a cláusula CHECK na criação de chaves estrangeiras. A instrução WITH CHECK está marcada como não suportada. Além disso, a cláusula WITH NO CHECK foi removida porque é o comportamento padrão no Snowflake e a equivalência é a mesma.

Analise os exemplos a seguir para entender melhor a conversão.

SQL Server
ALTER TABLE testTable
WITH CHECK ADD CONSTRAINT testFK1 FOREIGN KEY (table_id)
REFERENCES otherTable (Othertable_id);

ALTER TABLE testTable
WITH NOCHECK ADD CONSTRAINT testFK2 FOREIGN KEY (table_id)
REFERENCES otherTable (Othertable_id);
Snowflake
ALTER TABLE testTable
----** SSC-FDM-0014 - CHECK STATEMENT NOT SUPPORTED **
--WITH CHECK
           ADD CONSTRAINT testFK1 FOREIGN KEY (table_id)
REFERENCES otherTable (Othertable_id);


ALTER TABLE testTable
ADD CONSTRAINT testFK2 FOREIGN KEY (table_id)
REFERENCES otherTable (Othertable_id);

Problemas conhecidos

1. Cláusula NOT FOR REPLICATION.

O Snowflake tem uma abordagem diferente para os casos de replicação. Veja a documentação a seguir.

2. Cláusula WITHCHECK.

O Snowflake não suporta a instrução WITH CHECK. Consulte a documentação a seguir para obter mais informações.

PRIMARY KEY / UNIQUE

Applies to
  • SQL Server

  • Azure Synapse Analytics

Descrição

Todas as cláusulas opcionais da restrição PRIMARY KEY / UNIQUE foram removidas no Snowflake.

Sintaxe no SQL Server

{ PRIMARY KEY | UNIQUE }
    [ CLUSTERED | NONCLUSTERED ]
    [ WITH FILLFACTOR = fillfactor ]
    [ WITH ( index_option [, ...n ] ) ]
    [ ON { partition_scheme_name (partition_column_name)
        | filegroup | "default" } ]

Amostra de padrões da origem

SQL Server

ALTER TABLE table_name
ADD column_name INTEGER
CONSTRAINT constraint_name UNIQUE;

ALTER TABLE table_name
ADD column_name INTEGER
CONSTRAINT constraint_name PRIMARY KEY
NONCLUSTERED;

ALTER TABLE table_name
ADD column_name INTEGER
CONSTRAINT constraint_name UNIQUE
WITH FILLFACTOR = 80;

ALTER TABLE table_name
ADD column_name INTEGER
CONSTRAINT constraint_name PRIMARY KEY
WITH (PAD_INDEX = off);

ALTER TABLE table_name
ADD column_name INTEGER
CONSTRAINT constraint_name UNIQUE
ON partition_scheme_name (partition_column_name);

Snowflake

ALTER TABLE table_name
ADD column_name INTEGER
CONSTRAINT constraint_name UNIQUE;


ALTER TABLE table_name
ADD column_name INTEGER
CONSTRAINT constraint_name PRIMARY KEY;


ALTER TABLE table_name
ADD column_name INTEGER
CONSTRAINT constraint_name UNIQUE;


ALTER TABLE table_name
ADD column_name INTEGER
CONSTRAINT constraint_name PRIMARY KEY;


ALTER TABLE table_name
ADD column_name INTEGER
CONSTRAINT constraint_name UNIQUE;