SnowConvert: Transactステートメント

ALTER TABLE

説明

列や制約を変更、追加、ドロップすることで、テーブル定義を変更します。ALTER TABLE は、パーティションの再割り当てと再構築、制約とトリガーの無効化と有効化も行います。(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

説明

注釈

わかりやすくするため、出力コードの一部を省略しています。

SQL Serverコードで追加されていた制約がSnowflakeでまったくサポートされていない場合、その制約ステートメントは無効になるため、Snowconvertはチェック制約ステートメントをコメントアウトします。

サンプルソースパターン

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

既知の問題

1.無効な CHECK CONSTRAINT はコメントアウトされ、無効な ALTER TABLE ステートメントが残ります。

ADD

説明

注釈

SQL Serverでは、 ADD 句は ADD ごとに複数のアクションを許可しますが、Snowflakeでは ADD 列の一連のアクションしか許可しません。その結果、 SnowConvert は ALTER TABLE ADD 句を個々の ALTER TABLE ステートメントに分割します。

ADD キーワードによって提供される機能のサブセットがあり、ターゲットテーブルに異なる要素を追加することができます。これらには次が含まれます。

  • 列の定義

  • 計算列定義

  • テーブル制約

  • 列セット定義

TABLE CONSTRAINT

Applies to
  • [x] SQL Server

注釈

わかりやすくするため、出力コードの一部を省略しています。

説明

ALTER TABLE を使用してテーブルに追加された新しい列定義の一部である PRIMARY KEY、 FOREIGN KEY、 UNIQUE、または CHECK 制約のプロパティを指定します。(https://docs.microsoft.com/en-us/sql/t-sql/statements/alter-table-column-constraint-transact-sql)

列制約の翻訳は比較的簡単です。構文には、Snowflakeでは必須ではない部分やサポートされていない部分がいくつかあります。

これらの部分には次のようなものがあります。

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

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

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

サンプルソースパターン

複数の 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

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

既知の問題

1.DEFAULT は CREATE TABLE および ALTER TABLE ... ADD COLUMN 内でのみサポートされます

SQL Serverは制約内での DEFAULT プロパティの定義をサポートしていますが、Snowflakeでは CREATE TABLE または ALTER TABLE ... ADD COLUMN を介して列を追加する場合にのみそれを許可します。 ADD CONSTRAINT 構文内の DEFAULT プロパティはサポートされておらず、 ALTER TABLE ALTER COLUMN に翻訳されます。

関連 EWIs

  1. SSC-EWI-0035: チェックステートメントがサポートされていません。

  2. SSC-EWI-0040: ステートメントがサポートされていません。

  3. SSC-FDM-TS0020: デフォルト制約がコメントアウトされ、テーブル定義に追加された可能性があります。

CHECK

Applies to
  • [x] SQL Server

説明

注釈

わかりやすくするため、出力コードの一部を省略しています。

ALTER ステートメントに CHECK 句がある場合、サポートされていないため、Snowconvertはステートメント全体をコメントアウトします。

サンプルソースパターン

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

既知の問題

1. ALTER TABLE CHECK 句はSnowflakeではサポートされていません。

Snowflakeではサポートされていないため、 ALTER TABLE CHECK 句全体がコメントアウトされています。

関連 EWIs

  • SSC-EWI-0035: チェックステートメントがサポートされていません。

CONNECTION

Applies to
  • [x] SQL Server

説明

注釈

わかりやすくするため、出力コードの一部を省略しています。

ALTER ステートメントに CONNECTION 句がある場合、サポートされていないため、Snowconvertはステートメント全体をコメントアウトします。

サンプルソースパターン

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

既知の問題

1. ALTER TABLE CONNECTION 句はSnowflakeではサポートされていません。

Snowflakeではサポートされていないため、 ALTER TABLE CONNECTION 句全体がコメントアウトされています。

関連 EWIs

  • SSC-EWI-0109: テーブル変更構文はSnowflakeでは適用できません。

DEFAULT

Applies to
  • [x] SQL Server

説明

ALTER ステートメントに DEFAULT 句がある場合、サポートされていないため、Snowconvertはステートメント全体をコメントアウトします。

唯一の機能シナリオは、テーブル定義が同じファイル上にある場合に起こります。この場合、デフォルトは列定義に追加されます。

サンプルソースパターン

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

既知の問題

1.ALTER TABLE DEFAULT 句はSnowflakeではサポートされていません。

Snowflakeではサポートされていないため、 ALTER TABLE DEFAULT 句全体がコメントアウトされています。

関連 EWIs

  1. SSC-FDM-TS0020: デフォルト制約がコメントアウトされ、テーブル定義に追加された可能性があります。

FOREIGN KEY

Applies to
  • [x] SQL Server

説明

注釈

わかりやすくするため、出力コードの一部を省略しています。

Snowflakeは参照整合性制約の文法とそのプロパティをサポートし、他のデータベースからの移行を容易にします。

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

サンプルソースパターン

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

注釈

Snowflakeでは、 NOT NULL を除いて制約は強制されません。

主キーと外部キーは、設計制約よりもドキュメント目的で使用されます。

既知の問題

問題は見つかりませんでした

関連 EWIs

関連 EWIs はありません。

ON PARTITION

Applies to
  • [x] SQL Server

注釈

関連性のないステートメント。

警告

このステートメントは 関連性のない構文であるため、 移行から削除されていることに注意してください。 Snowflakeでは必要ないということです。

説明

注釈

わかりやすくするため、出力コードの一部を省略しています。

Transact SQL Serverでは、 on partition ステートメントは、 alter ステートメントの中で使用され、データベース全体でデータを分割するために使用されます。詳しくは こちら をご覧ください。

サンプルソースパターン

On Partition

この例では、 ON PARTITION が削除されていることに注意してください。これは、Snowflakeが統合パーティショニング手法を提供しているためです。したがって、構文は関係ありません。

 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

既知の問題

問題は見つかりませんでした。

関連 EWIs

関連 EWIs はありません。

PRIMARY KEY

Applies to
  • [x] SQL Server

説明

注釈

わかりやすくするため、出力コードの一部を省略しています。

SQL Serverの主キーには、Snowflakeには適用できない句が多くあります。そのため、ステートメントのほとんどはコメントアウトされます。

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

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

サンプルソースパターン

警告

WITH FILLFACTOR ステートメントは、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

既知の問題

問題は見つかりませんでした

関連 EWIs

関連 EWIs はありません。

COLUMN DEFINITION

Applies to
  • [x] SQL Server

  • [x] Azure Synapse Analytics

注釈

わかりやすくするため、出力コードの一部を省略しています。

説明

ALTER TABLE を使用してテーブルに追加される列のプロパティを指定します。

Snowflakeで 列定義 を追加する場合、 SQL Serverと比べていくつかの違いがあります。

例えば、 SQL Server の文法のいくつかの部分は、Snowflakeでは必要ないか、完全にサポートされていません。これらには次が含まれます。

さらに、他のいくつかの部分は部分的にサポートされており、オリジナルの機能を適切にエミュレートするためには、追加の作業を実装する必要があります。具体的にはMASKED WITH プロパティについて説明します。このページの パターンセクションで取り上げます。

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

サンプルソースパターン

基本パターン

このパターンは、オリジナルの ALTER TABLE から要素を削除することを示しています。

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

COLLATE

照合では、文字列の比較についてより広範なルールを指定することができます。

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

照合ルールの命名法は SQL ServerとSnowflakeで異なるため、調整が必要です。

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

このパターンは、 MASKED WITH プロパティの翻訳を示しています。CREATE OR REPLACE MASKING POLICY を最初の使用の前のどこかに挿入し、 SET MASKING POLICY 句で参照します。\ \ 新しい MASKING POLICY の名前は、以下のように、元の MASKED WITH FUNCTION の名前と引数を連結したものになります。

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

このパターンは、 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

このパターンは、 ENCRYPTED WITH プロパティの翻訳を示しています。出力コードではコメントアウトされています。

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

SQL Server NOT NULL 句は、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

このパターンは、 IDENTITY の翻訳を示しています。Snowflakeでは NOT FOR REPLICATION の部分が削除されます。

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

サポートされていない句

FILESTREAM

FILESTREAM のオリジナルの動作はSnowflakeでは複製不可能であり、 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

SQL Serverでは SPARSE は、 NULL ストレージに最適化された列を定義するために使われます。しかし、Snowflakeを使用する場合、この句を使用する必要はありません。

Snowflakeは テーブルに対する最適化 を自動的に実行するため、ユーザーが手作業で最適化を行う必要がなくなります。

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

既知の問題

1.マスキングポリシーを設定するには、事前にロールとユーザーをセットアップする必要があります

Snowflakeのマスキングポリシーは、ポリシー作成後にのみ列に適用できます。このため、正しく機能させるには、ユーザーがポリシーを作成し、それをロールに割り当て、そのロールをユーザーに割り当てる必要があります。マスキングポリシーは、クエリするユーザーによって動作が異なります。

SnowConvert はこのセットアップを自動的に行いません。

2.マスキングポリシーには、Snowflake Enterpriseアカウント以上が必要です。

上位ランクSnowflakeドキュメントによると、マスキングポリシーはEnterprise以上のランクのアカウントで使用可能です。

注釈

詳細については、 CREATE MASKING POLICY — Snowflakeドキュメント をご覧ください。

3.DEFAULT は定数値のみをサポートします

SQL Serverの DEFAULT プロパティは、関連する値が定数である限り、Snowflakeで部分的にサポートされています。

4. FILESTREAM 句はSnowflakeではサポートされていません。

Snowflakeではサポートされていないため、 FILESTSTREAM 句全体がコメントアウトされています。

5. SPARSE 句はSnowflakeではサポートされていません。

Snowflakeではサポートされていないため、 SPARSE 句全体がコメントアウトされています。それが ALTER COLUMN ステートメント内に追加され、それが列に対して行われる唯一の変更である場合、何も追加されなくなるため、ステートメント全体が削除されます。

関連 EWIs

  1. SSC-EWI-0040: ステートメントがサポートされていません。

  2. SSC-EWI-TS0061: ALTER COLUMN はサポートされていません。

  3. SSC-EWI-TS0078: Snowflakeではデフォルト値は許可されていません。

  4. SSC-FDM-TS0009: Encrypted withはSnowflakeではサポートされていません。

  5. SSC-FDM-TS0021: MASKED WITH の代用として MASKING POLICY が作成されました。

  6. SSC-FDM-TS0022: ユーザーは事前にマスキングロールを定義しておく必要があります。

  7. SSC-PRF-0002: 大文字と小文字を区別しない列はクエリのパフォーマンスを低下させる可能性があります。

COLUMN CONSTRAINT

Applies to
  • [x] SQL Server

  • [x] Azure Synapse Analytics

説明

Alter Tableを使用してテーブルに追加された新しい 列制約 の一部である PRIMARY KEY、 FOREIGN KEY、または CHECK のプロパティを指定します。

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

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

条件:

 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

説明

注釈

わかりやすくするため、出力コードの一部を省略しています。

ALTER ステートメントに CHECK 句がある場合、サポートされていないため、Snowconvertはステートメント全体をコメントアウトします。

サンプルソースパターン

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

既知の問題

1. ALTER TABLE CHECK 句はSnowflakeではサポートされていません。

Snowflakeではサポートされていないため、 ALTER TABLE CHECK 句全体がコメントアウトされています。

関連 EWIs

  • SSC-EWI-0035: チェックステートメントがサポートされていません。

FOREIGN KEY

Applies to
  • [x] SQL Server

  • [x] Azure Synapse Analytics

説明

外部キーの構文は、 [ NOT FOR REPLICATION ]WITH CHECK 句を除いて、 SnowFlake で完全にサポートされています。

SQL Serverでの構文

詳しくは、以下の SQL Serverドキュメント をご覧ください。

 [ 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

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

サンプルソースパターン

一般的なケース

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

WITH CHECK / NO CHECK ケース

Snowflakeロジックは外部キーの作成において CHECK 句をサポートしていないことに注意してください。WITH CHECK ステートメントはサポートされていないとマークされています。また、 WITH NO CHECK 句はSnowflakeのデフォルトの動作であり、等価性は同じであるため削除しました。

翻訳をより理解するために、以下の例をご覧ください。

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

既知の問題

1. NOT FOR REPLICATION 句。

Snowflakeは複製ケースに対して異なるアプローチを持っています。以下の ドキュメント をご覧ください。

2.WITH CHECK 句。

Snowflakeは WITH CHECK ステートメントをサポートしていません。詳細は以下の ドキュメント をご覧ください。

関連 EWIs

関連 EWIs はありません。

PRIMARY KEY / UNIQUE

Applies to
  • [x] SQL Server

  • [x] Azure Synapse Analytics

説明

Snowflakeでは、 PRIMARY KEY / UNIQUE 制約のオプション句はすべて削除されます。

SQL Serverでの構文

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

サンプルソースパターン

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

既知の問題

問題は見つかりませんでした。

関連 EWIs

関連 EWIs はありません。

SET

ANSI_NULLS

Applies to
  • [x] SQL Server

  • [x] Azure Synapse Analytics

説明

このステートメントは、 SQLServer でnull値とともに使用されるときのEqualsおよびNot Equal to比較演算子の ISO 準拠の動作を指定します。このステートメントに関する詳細情報は、 SET ANSI_NULLS をご覧ください。

Transact-SQL 構文

 SET ANSI_NULLS { ON | OFF }
Copy

サンプルソースパターン

SET ANSI_NULLS ON

"SET ANSI_NULLS ON は、比較のオペランドの1つが NULL 変数かリテラル NULL の場合にのみ比較に影響します。比較の両側が列または複合式の場合、セットは比較に影響しません。" (SQLServer ANSI_NULLS 記事)。

Snowflakeはこのステートメントをサポートしていないため、 ANSI_୧NULLS ON の場合、equalとnot equal比較操作の実行に関連性がないため、 FDM (SSC-FDM-TS0027)でマークされます。ここでは、 Snowflakeの NULL 処置 についての説明をご覧いただけます。

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

"ANSI_NULLS が OFF の場合、Equals(=)およびNot Equal To(<>)比較演算子は ISO 標準に従いません。WHERE column_name = NULL を使用する SELECT ステートメントは、column_nameにnull値がある行を返します。WHERE column_name <> NULL を使用する SELECT ステートメントは、列に NULL 以外の値を持つ行を返します"。(SQLServer ANSI_NULLS 記事)。

ANSI_NULLS OFF ステートメントの場合、余分な手作業が必要なため、このステートメントには EWI (SSC-EWI-0040)が付いています。

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

  1. SSC-EWI-0040: ステートメントはSnowflakeではサポートされていません

  2. SSC-FDM-0027: SET ANSI_NULLS ON ステートメントがSnowflakeで異なる動作をする可能性があります