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
Snowflake¶
!!!RESOLVE EWI!!! /*** SSC-EWI-0035 - CHECK STATEMENT NOT SUPPORTED ***/!!!
ALTER TABLE IF EXISTS Person.EmailAddress CHECK CONSTRAINT FK_EmailAddress_Person_BusinessEntityID;
既知の問題¶
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 )
}
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 ]
サンプルソースパターン¶
複数の 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¶
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
;
既知の問題¶
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¶
SSC-EWI-0035: チェックステートメントがサポートされていません。
SSC-EWI-0040: ステートメントがサポートされていません。
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);
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);
既知の問題¶
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;
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;
既知の問題¶
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;
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
;
既知の問題¶
1.ALTER TABLE DEFAULT 句はSnowflakeではサポートされていません。
Snowflakeではサポートされていないため、 ALTER TABLE DEFAULT 句全体がコメントアウトされています。
関連 EWIs¶
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 ]
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 ]
サンプルソースパターン¶
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;
注釈
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);
ALTER TABLE table_name
ADD column_name INTEGER
CONSTRAINT constraint_name UNIQUE;
既知の問題¶
問題は見つかりませんでした。
関連 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" } ]
Snowflakeの構文
[ CONSTRAINT <constraint_name> ]
{ UNIQUE | PRIMARY KEY } ( <col_name> [ , <col_name> , ... ] )
[ [ NOT ] ENFORCED ]
[ [ NOT ] DEFERRABLE ]
[ INITIALLY { DEFERRED | IMMEDIATE } ]
[ ENABLE | DISABLE ]
[ VALIDATE | NOVALIDATE ]
[ RELY | NORELY ]
サンプルソースパターン¶
警告
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";
Snowflake¶
ALTER TABLE Production.TransactionHistoryArchive
ADD CONSTRAINT PK_TransactionHistoryArchive_TransactionID PRIMARY KEY (TransactionID);
既知の問題¶
問題は見つかりませんでした
関連 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 ] ]
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 , ... ) ] ]
サンプルソースパターン¶
基本パターン¶
このパターンは、オリジナルの ALTER TABLE から要素を削除することを示しています。
SQL Server¶
ALTER TABLE table_name
ADD column_name INTEGER;
Snowflake¶
ALTER TABLE IF EXISTS table_name
ADD column_name INTEGER;
COLLATE¶
照合では、文字列の比較についてより広範なルールを指定することができます。
SQL Server¶
ALTER TABLE table_name
ADD COLUMN new_column_name VARCHAR
COLLATE Latin1_General_CI_AS;
照合ルールの命名法は 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 ***/;
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) ' );
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¶
このパターンは、 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¶
このパターンは、 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'
);
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¶
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;
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¶
このパターンは、 IDENTITY の翻訳を示しています。Snowflakeでは NOT FOR REPLICATION
の部分が削除されます。
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 ;
サポートされていない句¶
FILESTREAM¶
FILESTREAM
のオリジナルの動作はSnowflakeでは複製不可能であり、 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¶
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;
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;
既知の問題¶
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¶
SSC-EWI-0040: ステートメントがサポートされていません。
SSC-EWI-TS0061: ALTER COLUMN はサポートされていません。
SSC-EWI-TS0078: Snowflakeではデフォルト値は許可されていません。
SSC-FDM-TS0009: Encrypted withはSnowflakeではサポートされていません。
SSC-FDM-TS0021: MASKED WITH の代用として MASKING POLICY が作成されました。
SSC-FDM-TS0022: ユーザーは事前にマスキングロールを定義しておく必要があります。
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 )
}
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 }
条件:
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
説明¶
注釈
わかりやすくするため、出力コードの一部を省略しています。
ALTER ステートメントに CHECK 句がある場合、サポートされていないため、Snowconvertはステートメント全体をコメントアウトします。
サンプルソースパターン¶
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);
既知の問題¶
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 ]
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 ]
サンプルソースパターン¶
一般的なケース¶
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);
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);
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);
既知の問題¶
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" } ]
サンプルソースパターン¶
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;
既知の問題¶
問題は見つかりませんでした。
関連 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 }
サンプルソースパターン¶
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;
Snowflake¶
----** SSC-FDM-TS0027 - SET ANSI_NULLS ON STATEMENT MAY HAVE A DIFFERENT BEHAVIOR IN SNOWFLAKE **
--SET ANSI_NULLS ON
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;
Snowflake¶
!!!RESOLVE EWI!!! /*** SSC-EWI-0040 - THE STATEMENT IS NOT SUPPORTED IN SNOWFLAKE ***/!!!
SET ANSI_NULLS OFF;
関連 EWIs¶
SSC-EWI-0040: ステートメントはSnowflakeではサポートされていません
SSC-FDM-0027: SET ANSI_NULLS ON ステートメントがSnowflakeで異なる動作をする可能性があります