SnowConvert: Instruções no Transact

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
  • [x] SQL Server

  • [x] Azure Synapse Analytics

Descrição

Nota

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

Quando a restrição que estava sendo adicionada no código do SQL Server não é suportada no Snowflake, o Snowconvert comenta a instrução Check constraint, já que ela não é mais válida.

Amostra de padrões da origem

SQL Server

 ALTER TABLE
    [Person].[EmailAddress] CHECK CONSTRAINT [FK_EmailAddress_Person_BusinessEntityID]
GO
Copy
Snowflake
 !!!RESOLVE EWI!!! /*** SSC-EWI-0035 - CHECK STATEMENT NOT SUPPORTED ***/!!!
ALTER TABLE IF EXISTS Person.EmailAddress CHECK CONSTRAINT FK_EmailAddress_Person_BusinessEntityID;
Copy

Problemas conhecidos

1. CHECK CONSTRAINT inválido é comentado, deixando uma instrução ALTER TABLE inválida.

ADD

Descrição

Nota

No SQL Server, a cláusula ADD permite várias ações por ADD, enquanto o Snowflake permite apenas uma sequência de ações da coluna ADD. Consequentemente, o SnowConvert 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
  • [x] 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 )  
}
Copy

Sintaxe no Snowflake

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

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
Copy
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 ;
Copy

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
Copy
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
                                                                                         ;
Copy

Problemas conhecidos

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

O SQL Server suporta a definição de uma propriedade DEFAULT dentro de uma restrição, enquanto o Snowflake só permite isso ao adicionar a coluna por meio de CREATE TABLE ou ALTER TABLE... ADD COLUMN. As propriedades DEFAULT dentro da sintaxe ADD CONSTRAINT não são suportadas e serão convertidas para ALTER TABLE ALTER COLUMN.

EWIs relacionados

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

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

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

CHECK

Applies to
  • [x] SQL Server

Descrição

Nota

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

Quando a cláusula CHECK estiver na instrução ALTER, o Snowconvert comentará a instrução inteira, pois ela não é compatível.

Amostra de padrões da origem

SQL Server

 ALTER TABLE dbo.doc_exd    
ADD CONSTRAINT exd_check CHECK NOT FOR REPLICATION (column_a > 1); 
Copy
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);
Copy

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
  • [x] SQL Server

Descrição

Nota

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

Quando a cláusula CONNECTION estiver na instrução ALTER, o Snowconvert comentará a instrução inteira, pois ela 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;
Copy
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;
Copy

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
  • [x] SQL Server

Descrição

Quando a cláusula DEFAULT estiver na instrução ALTER, o Snowconvert comentará a instrução inteira, pois ela 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;
Copy
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
                                                                                ;
Copy

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
  • [x] 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.

Sintaxe no 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 ]
Copy
Sintaxe no 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 ]
Copy

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;
Copy
Snowflake
 ALTER TABLE Tests.dbo.Employee
ADD CONSTRAINT FK_Department FOREIGN KEY(DepartmentID) REFERENCES Department (DepartmentID)
ON UPDATE CASCADE
ON DELETE NO ACTION;
Copy

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.

Problemas conhecidos

Não foram encontrados problemas

EWIs relacionados

Sem EWIs relacionados.

ON PARTITION

Applies to
  • [x] SQL Server

Nota

Instrução não relevante.

Aviso

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

Descrição

Nota

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

No Transact SQL Server, a instrução on partition é usada dentro das instruções alter e é usada para dividir os dados no banco de dados. Veja mais informações aqui.

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.

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

Problemas conhecidos

Não foram encontrados problemas.

EWIs Relacionados

Sem EWIs relacionados.

PRIMARY KEY

Applies to
  • [x] 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" } ]   
Copy

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

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";
Copy

Snowflake

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

Problemas conhecidos

Não foram encontrados problemas

EWIs relacionados

Sem EWIs relacionados.

COLUMN DEFINITION

Applies to
  • [x] SQL Server

  • [x] 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:

Além disso, algumas outras partes têm suporte parcial e exigem trabalho adicional para serem implementadas a fim de emular adequadamente a funcionalidade original. Especificamente, estamos falando da propriedade MASKED WITH, que será abordada na seção padrões desta página.

Sintaxe no 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 ] ]  
Copy

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 , ... ) ] ]
Copy

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;
Copy
Snowflake
 ALTER TABLE IF EXISTS table_name
ADD column_name INTEGER;
Copy

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;
Copy

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 ***/;
Copy

MASKED WITH

Esse padrão mostra a conversão para a propriedade MASKED WITH. CREATE OR REPLACE MASKING POLICY é inserido em algum lugar antes do primeiro uso e, em seguida, referenciado por uma cláusula SET MASKING POLICY. O nome do novo MASKING POLICY será a concatenação do nome e dos argumentos do MASKED WITH FUNCTION original, conforme mostrado abaixo:

SQL Server
 ALTER TABLE table_name
ALTER COLUMN column_name
ADD MASKED WITH ( FUNCTION = ' random(1, 999) ' );
Copy
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";
Copy

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;
Copy
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;
Copy

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'  
  );
Copy
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'
--  )
   ;
Copy

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;
Copy
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;
Copy

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;
Copy
Snowflake
 CREATE OR REPLACE SEQUENCE table3_column_test
START WITH 1
INCREMENT BY 100
COMMENT = 'FOR TABLE-COLUMN table3.column_test';

ALTER TABLE table3
ADD COLUMN column_test INTEGER DEFAULT table3_column_test.NEXTVAL ;
Copy

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;
Copy
Snowflake
 ALTER TABLE IF EXISTS table2
ADD column1 VARBINARY
!!!RESOLVE EWI!!! /*** SSC-EWI-0040 - THE STATEMENT IS NOT SUPPORTED IN SNOWFLAKE ***/!!!
FILESTREAM;
Copy

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;
Copy
Snowflake
 -- ADD COLUMN DEFINITION form
ALTER TABLE IF EXISTS table3
ADD column1 INT NULL
                     !!!RESOLVE EWI!!! /*** SSC-EWI-0040 - THE STATEMENT IS NOT SUPPORTED IN SNOWFLAKE ***/!!! SPARSE;

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

-- CREATE TABLE form
CREATE OR REPLACE TABLE table3
(
    column1 INT
                !!!RESOLVE EWI!!! /*** SSC-EWI-0040 - THE STATEMENT 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;
Copy

ROWGUIDCOL

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

Problemas conhecidos

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

As políticas de mascaramento do Snowflake podem ser aplicadas às colunas somente depois que as políticas forem criadas. Isso exige que o usuário crie as políticas e as atribua a funções, e essas funções a usuários, para que funcionem corretamente. As políticas de mascaramento podem se comportar de forma diferente, dependendo do usuário que está fazendo a consulta.

O SnowConvert não realiza essa configuração automaticamente.

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

A documentação do Snowflake afirma que as políticas de mascaramento estão disponíveis em contas Entreprise ou de nível superior.

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: As colunas que não diferenciam maiúsculas de minúsculas podem diminuir o desempenho das consultas.

COLUMN CONSTRAINT

Applies to
  • [x] SQL Server

  • [x] 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.

Sintaxe no 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 )  
}  
Copy

Sintaxe no 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 }
Copy

Onde:

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

CHECK

Applies to
  • [x] SQL Server

Descrição

Nota

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

Quando a cláusula CHECK estiver na instrução ALTER, o Snowconvert comentará a instrução inteira, pois ela não é compatível.

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);
Copy
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);
Copy

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
  • [x] SQL Server

  • [x] Azure Synapse Analytics

Descrição

A sintaxe da chave estrangeira é totalmente compatível com o SnowFlake, exceto pelas cláusulas [ NOT FOR REPLICATION ] e WITH CHECK.

Sintaxe no 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 ]
Copy

Sintaxe no 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 ]
Copy

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;
Copy

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);
Copy

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);
Copy

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);
Copy

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.

EWIs relacionados

Sem EWIs relacionados.

PRIMARY KEY / UNIQUE

Applies to
  • [x] SQL Server

  • [x] 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" } ]
Copy

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);
Copy
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;
Copy

Problemas conhecidos

Não foram encontrados problemas.

EWIs relacionados

Sem EWIs relacionados.

SET

ANSI_NULLS

Applies to
  • [x] SQL Server

  • [x] Azure Synapse Analytics

Descrição

Essa instrução especifica o comportamento em conformidade com ISO dos operadores de comparação Equals e Not Equal to quando usados com valores nulos no SQLServer. Acesse SET ANSI_NULLS para obter mais informações sobre essa instrução.

Sintaxe do Transact-SQL

 SET ANSI_NULLS { ON | OFF }
Copy

Amostra de padrões da origem

SET ANSI_NULLS ON

«SET ANSI_NULLS ON afeta uma comparação somente se um dos operandos da comparação for uma variável que seja NULL ou um literal NULL. Se ambos os lados da comparação forem colunas ou expressões compostas, a configuração não afetará a comparação.» (artigo SQLServer ANSI_NULLS).

O Snowflake não oferece suporte a essa instrução, portanto, no caso de ANSI_NULLS ON, isso é marcado com um FDM (SSC-FDM-TS0027) porque não tem relevância na execução de operações de comparação iguais e não iguais. Aqui, você pode encontrar uma explicação sobre o tratamento de NULL no Snowflake.

SQL Server
 SET ANSI_NULLS ON;
Copy
Snowflake
 ----** SSC-FDM-TS0027 - SET ANSI_NULLS ON STATEMENT MAY HAVE A DIFFERENT BEHAVIOR IN SNOWFLAKE **
--SET ANSI_NULLS ON
Copy

SET ANSI_NULLS OFF

«Quando ANSI_NULLS é OFF, os operadores de comparação Equals (=) e Not Equal To (<>) não seguem o padrão ISO. Uma instrução SELECT que usa WHERE column_name = NULL retorna as linhas que têm valores nulos em column_name. Uma instrução SELECT que usa WHERE column_name <> NULL retorna as linhas que têm valores não NULL na coluna». (artigo SQLServer ANSI_NULLS).

No caso da instrução ANSI_NULLS OFF, ela é marcada com um EWI (SSC-EWI-0040) porque exige esforço manual extra.

SQL Server
 SET ANSI_NULLS OFF;
Copy
Snowflake
 !!!RESOLVE EWI!!! /*** SSC-EWI-0040 - THE STATEMENT IS NOT SUPPORTED IN SNOWFLAKE ***/!!!
SET ANSI_NULLS OFF;
Copy

EWIs relacionados

  1. SSC-EWI-0040: A instrução não é compatível com o Snowflake

  2. SSC-FDM-0027: A instrução SET ANSI_NULLS ON pode ter um comportamento diferente no Snowflake