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 서버
[x] Azure 시냅스 분석
설명¶
참고
출력 코드의 일부 부분은 명확성을 위해 생략되었습니다.
SQL 서버 코드에서 추가되던 제약 조건이 Snowflake에서 전혀 지원되지 않는 경우, 더 이상 유효하지 않으므로 Snowconvert는 제약 조건 확인 문을 설명합니다.
샘플 소스 패턴¶
SQL 서버¶
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;
Known Issues¶
1. 잘못된 CHECK CONSTRAINT 문이 설명되어 잘못된 ALTER TABLE 문이 남습니다.
ADD¶
설명¶
참고
SQL 서버에서 ADD 절은 ADD 당 여러 작업을 허용하는 반면, Snowflake는 ADD 열 작업 시퀀스만 허용합니다. 따라서 SnowConvert 는 ALTER TABLE ADD 절을 개별 ALTER TABLE 문으로 나눕니다.
ADD 키워드에서 제공하는 함수의 하위 집합이 있어 대상 테이블에 다양한 요소를 추가할 수 있습니다. 다음과 같은 오브젝트가 이에 해당합니다.
열 정의
계산된 열 정의
테이블 제약 조건
열 세트 정의
TABLE CONSTRAINT¶
Applies to
[x] SQL 서버
참고
출력 코드의 일부 부분은 명확성을 위해 생략되었습니다.
설명¶
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 서버의 구문
[ 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 서버¶
-- 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 서버¶
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
;
Known Issues¶
1. DEFAULT 는 CREATE TABLE
및 ALTER TABLE ... ADD COLUMN
내에서만 지원됩니다.
SQL 서버는 제약 조건 내에서 DEFAULT
속성을 정의하는 것을 지원하지만, Snowflake는 CREATE TABLE
또는 ALTER TABLE ... ADD COLUMN
을 통해 열을 추가할 때만 허용합니다. ADD CONSTRAINT
구문 내의 DEFAULT
속성은 지원되지 않으며 ALTER TABLE ALTER COLUMN 으로 변환됩니다.
관련 EWIs¶
SSC-EWI-0035: Check 문은 지원되지 않습니다.
SSC-EWI-0040: 문은 지원되지 않습니다.
SSC-FDM-TS0020: 기본 제약 조건이 설명되어 있으며 테이블 정의에 추가되었을 수 있습니다.
CHECK¶
Applies to
[x] SQL 서버
설명¶
참고
출력 코드의 일부 부분은 명확성을 위해 생략되었습니다.
ALTER 문에 CHECK 절이 있는 경우, 지원되지 않으므로 Snowconvert는 전체 문을 설명합니다.
샘플 소스 패턴¶
SQL 서버¶
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);
Known Issues¶
1. ALTER TABLE CHECK 절은 Snowflake에서 지원되지 않습니다.
ALTER TABLE CHECK 절 전체는 Snowflake에서 지원되지 않으므로 설명이 생략되어 있습니다.
관련 EWIs¶
SSC-EWI-0035: Check 문은 지원되지 않습니다.
CONNECTION¶
Applies to
[x] SQL 서버
설명¶
참고
출력 코드의 일부 부분은 명확성을 위해 생략되었습니다.
ALTER 문에 CONNECTION 절이 있는 경우, 지원되지 않으므로 Snowconvert는 전체 문을 설명합니다.
샘플 소스 패턴¶
SQL 서버¶
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;
Known Issues¶
1. ALTER TABLE CONNECTION 절은 Snowflake에서 지원되지 않습니다.
ALTER TABLE CONNECTION 절 전체는 Snowflake에서 지원되지 않으므로 설명이 생략되어 있습니다.
관련 EWIs¶
SSC-EWI-0109: 테이블 변경 구문은 Snowflake에 적용할 수 없습니다.
DEFAULT¶
Applies to
[x] SQL 서버
설명¶
ALTER 문에 DEFAULT 절이 있는 경우, 지원되지 않으므로 Snowconvert는 전체 문을 설명합니다.
유일한 함수 시나리오는 테이블 정의가 동일한 파일에 있을 때 발생하며, 이러한 방식으로 기본값이 열 정의에 추가됩니다.
샘플 소스 패턴¶
SQL 서버¶
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
;
Known Issues¶
1. ALTER TABLE DEFAULT 절은 Snowflake에서 지원되지 않습니다.
ALTER TABLE DEFAULT 절 전체는 Snowflake에서 지원되지 않으므로 설명이 생략되어 있습니다.
관련 EWIs¶
SSC-FDM-TS0020: 기본 제약 조건이 설명되어 있으며 테이블 정의에 추가되었을 수 있습니다.
FOREIGN KEY¶
Applies to
[x] SQL 서버
설명¶
참고
출력 코드의 일부 부분은 명확성을 위해 생략되었습니다.
Snowflake는 참조 무결성 제약 조건 문법과 그 속성을 지원하여 다른 데이터베이스에서 쉽게 마이그레이션할 수 있도록 합니다.
SQL 서버의 구문¶
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 서버¶
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;
참고
NOT NULL 을 제외하고 Snowflake에서는 제약 조건이 적용되지 않습니다.
기본 키와 외래 키는 디자인 제약 조건보다 설명서 용도로만 사용됩니다.
Known Issues¶
발견된 문제 없음
관련 EWIs¶
관련 EWIs 없음.
ON PARTITION¶
Applies to
[x] SQL 서버
참고
관련 없는 문.
경고
이 문은 관련 없는 구문이므로 마이그레이션 에서 제거되었습니다. 즉, Snowflake에서는 필수가 아닙니다.
설명¶
참고
출력 코드의 일부 부분은 명확성을 위해 생략되었습니다.
Transact SQL 서버에서 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 서버
설명¶
참고
출력 코드의 일부 부분은 명확성을 위해 생략되었습니다.
SQL 서버 기본 키에는 Snowflake에 적용되지 않는 절이 많이 있습니다. 따라서 대부분의 문은 설명이 생략됩니다.
SQL 서버의 구문
{ 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 서버
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);
Known Issues¶
발견된 문제 없음
관련 EWIs¶
관련 EWIs 없음.
COLUMN DEFINITION¶
Applies to
[x] SQL 서버
[x] Azure 시냅스 분석
참고
출력 코드의 일부 부분은 명확성을 위해 생략되었습니다.
설명¶
ALTER TABLE 을 사용하여 테이블에 추가되는 열의 속성을 지정합니다.
Snowflake에서 열 정의 를 추가하는 것은 SQL 서버와 비교하여 몇 가지 차이점이 있습니다.
예를 들어, SQL 서버 문법의 여러 부분은 필수가 없거나 Snowflake에서 완전히 지원되지 않습니다. 다음과 같은 오브젝트가 이에 해당합니다.
또한 몇 가지 다른 부분은 부분적으로 지원되며 원래 기능을 올바르게 에뮬레이션하려면 추가 작업을 구현해야 합니다. 특히 이 페이지의 패턴 섹션에서 다룰 MASKED WITH
속성에 대해 설명합니다.
SQL 서버의 구문
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 서버¶
ALTER TABLE table_name
ADD column_name INTEGER;
Snowflake¶
ALTER TABLE IF EXISTS table_name
ADD column_name INTEGER;
COLLATE¶
데이터 정렬을 사용하면 문자열 비교에 대해 더 광범위한 규칙을 지정할 수 있습니다.
SQL 서버¶
ALTER TABLE table_name
ADD COLUMN new_column_name VARCHAR
COLLATE Latin1_General_CI_AS;
데이터 정렬 규칙 명명법은 SQL 서버마다 다르므로 이를 조정해야 합니다.
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 서버¶
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 서버¶
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 서버¶
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 서버¶
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 에 대한 변환을 보여줍니다. NOT FOR REPLICATION
부분은 Snowflake에서 제거됩니다.
SQL 서버¶
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 서버¶
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 서버에서 SPARSE 는 NULL 저장소에 최적화된 열을 정의하는 데 사용됩니다. 그러나 Snowflake를 사용하는 경우에는 이 절을 사용할 필요가 없습니다.
Snowflake는 테이블에 대한 최적화 를 자동으로 수행하므로 사용자가 수동으로 최적화할 필요성이 줄어듭니다.
SQL 서버¶
-- 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 서버¶
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;
Known Issues¶
1. 마스킹 정책을 위해 역할과 사용자를 미리 설정해야 합니다
Snowflake의 마스킹 정책은 정책을 생성한 후에만 열에 적용할 수 있습니다. 이를 위해서는 사용자가 정책을 생성하고 역할에 할당하고 사용자에게 이러한 역할을 할당해야 올바르게 작동합니다. 마스킹 정책은 쿼리하는 사용자에 따라 다르게 작동할 수 있습니다.
SnowConvert 는 이 설정을 자동으로 수행하지 않습니다.
2. 마스킹 정책을 사용하려면 Snowflake Enterprise 계정 이상이 필요합니다.
더 높은 등급 Snowflake 설명서에 따르면 마스킹 정책은 엔터프라이즈 이상의 등급 계정에서 사용할 수 있다고 명시되어 있습니다.
참고
자세한 내용은 CREATE MASKING POLICY — Snowflake 설명서 를 참조하십시오.
3. DEFAULT 는 상수 값만 지원합니다
SQL 서버의 DEFAULT 속성은 관련 값이 상수인 경우 Snowflake에서 부분적으로 지원됩니다.
4. FILESTREAM 절은 Snowflake에서 지원되지 않습니다.
FILESTSTREAM 절 전체는 Snowflake에서 지원되지 않으므로 설명이 생략되어 있습니다.
5. SPARSE 절은 Snowflake에서 지원되지 않습니다.
SPARSE 절 전체는 Snowflake에서 지원되지 않으므로 설명이 생략되어 있습니다. 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 서버
[x] Azure 시냅스 분석
설명¶
테이블 변경을 사용하여 테이블에 추가된 새 열 제약 조건 의 일부인 PRIMARY KEY, FOREIGN KEY 또는 CHECK 의 속성을 지정합니다
SQL 서버의 구문
[ 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 서버
설명¶
참고
출력 코드의 일부 부분은 명확성을 위해 생략되었습니다.
ALTER 문에 CHECK 절이 있는 경우, 지원되지 않으므로 Snowconvert는 전체 문을 설명합니다.
샘플 소스 패턴¶
SQL 서버¶
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);
Known Issues¶
1. ALTER TABLE CHECK 절은 Snowflake에서 지원되지 않습니다.
ALTER TABLE CHECK 절 전체는 Snowflake에서 지원되지 않으므로 설명이 생략되어 있습니다.
관련 EWIs¶
SSC-EWI-0035: Check 문은 지원되지 않습니다.
FOREIGN KEY¶
Applies to
[x] SQL 서버
[x] Azure 시냅스 분석
설명¶
외래 키의 구문은 [ NOT FOR REPLICATION ]
및 WITH CHECK
절을 제외하고 SnowFlake 에서 완벽하게 지원됩니다.
SQL 서버의 구문¶
자세한 내용은 다음 SQL 서버 설명서 를 참조하십시오.
[ 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 서버
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 서버
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);
Known Issues¶
1. NOT FOR REPLICATION 절.
Snowflake는 복제 케이스에 대한 접근법이 다릅니다. 다음 설명서 를 검토하십시오.
2. WITH CHECK 절.
Snowflake는 WITH CHECK
문을 지원하지 않습니다. 자세한 내용은 다음 설명서 를 참조하십시오.
관련 EWIs¶
관련 EWIs 없음.
PRIMARY KEY / UNIQUE¶
Applies to
[x] SQL 서버
[x] Azure 시냅스 분석
설명¶
PRIMARY KEY/UNIQUE 제약 조건의 모든 선택적 절은 Snowflake에서 제거됩니다.
SQL 서버의 구문
{ PRIMARY KEY | UNIQUE }
[ CLUSTERED | NONCLUSTERED ]
[ WITH FILLFACTOR = fillfactor ]
[ WITH ( index_option [, ...n ] ) ]
[ ON { partition_scheme_name (partition_column_name)
| filegroup | "default" } ]
샘플 소스 패턴¶
SQL 서버¶
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 서버
[x] Azure 시냅스 분석
설명¶
이 문은 SQLServer 에서 null 값과 함께 사용할 때 비교 연산자 같음 및 같지 않음에 대한 ISO 준수 동작을 지정합니다. 이 문에 대한 자세한 내용은 SET ANSI_NULLS 을 참조하십시오.
Transact-SQL 구문¶
SET ANSI_NULLS { ON | OFF }
샘플 소스 패턴¶
SET ANSI_NULLS ON¶
“SET ANSI_NULLS ON 은 비교의 피연산자 중 하나가 NULL 또는 리터럴 NULL 인 변수인 경우에만 비교에 영향을 미칩니다. 비교의 양쪽이 열 또는 복합 식인 경우 설정은 비교에 영향을 미치지 않습니다.”(SQLServer ANSI_NULLS 문서).
Snowflake는 이 문을 지원하지 않으므로 ANSI_NULLS ON 의 경우, 동일 및 동일하지 않음 비교 연산 실행과 관련이 없기 때문에 FDM (SSC-FDM-TS0027)으로 표시됩니다. 여기에서 Snowflake에서의 NULL 처리 에 대한 설명을 확인할 수 있습니다.
SQL 서버¶
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 인 경우 같음(=
) 및 같지 않음(<>
) 비교 연산자는 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 서버¶
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에서 동작이 다를 수 있습니다.