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
Snowflake¶
!!!RESOLVE EWI!!! /*** SSC-EWI-0035 - CHECK STATEMENT NOT SUPPORTED ***/!!!
ALTER TABLE IF EXISTS Person.EmailAddress CHECK CONSTRAINT FK_EmailAddress_Person_BusinessEntityID;
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 )
}
Sintaxe no 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
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¶
SSC-EWI-0035: Instrução Check não suportada.
SSC-EWI-0040: Instrução não suportada.
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);
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¶
SSC-EWI-0035: Instrução Check não suportada.
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;
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
[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;
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¶
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 ]
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 ]
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.
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);
ALTER TABLE table_name
ADD column_name INTEGER
CONSTRAINT constraint_name UNIQUE;
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" } ]
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);
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 ] ]
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¶
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) ' );
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¶
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 ;
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 STATEMENT 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
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;
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 STATEMENT 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
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¶
SSC-EWI-0040: Instrução não suportada.
SSC-EWI-TS0061: ALTER COLUMN não suportado.
SSC-EWI-TS0078: O valor padrão não é permitido no Snowflake.
SSC-FDM-TS0009: Encrypted with não suportado no Snowflake.
SSC-FDM-TS0021: Um MASKING POLICY foi criado como substituto do MASKED WITH.
SSC-FDM-TS0022: O usuário deve definir previamente a função de máscara.
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 )
}
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 }
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
[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);
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¶
SSC-EWI-0035: Instrução Check não suportada.
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 ]
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 ]
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.
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" } ]
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;
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 }
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;
Snowflake¶
----** SSC-FDM-TS0027 - SET ANSI_NULLS ON STATEMENT MAY HAVE A DIFFERENT BEHAVIOR IN SNOWFLAKE **
--SET ANSI_NULLS ON
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;
Snowflake¶
!!!RESOLVE EWI!!! /*** SSC-EWI-0040 - THE STATEMENT IS NOT SUPPORTED IN SNOWFLAKE ***/!!!
SET ANSI_NULLS OFF;
EWIs relacionados¶
SSC-EWI-0040: A instrução não é compatível com o Snowflake
SSC-FDM-0027: A instrução SET ANSI_NULLS ON pode ter um comportamento diferente no Snowflake