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
Copy
Snowflake
 !!!RESOLVE EWI!!! /*** SSC-EWI-0035 - CHECK STATEMENT NOT SUPPORTED ***/!!!
ALTER TABLE IF EXISTS Person.EmailAddress CHECK CONSTRAINT FK_EmailAddress_Person_BusinessEntityID;
Copy

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 )  
}
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 서버
 -- 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 서버
 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

Known Issues

1. DEFAULT 는 CREATE TABLEALTER TABLE ... ADD COLUMN 내에서만 지원됩니다.

SQL 서버는 제약 조건 내에서 DEFAULT 속성을 정의하는 것을 지원하지만, Snowflake는 CREATE TABLE 또는 ALTER TABLE ... ADD COLUMN 을 통해 열을 추가할 때만 허용합니다. ADD CONSTRAINT 구문 내의 DEFAULT 속성은 지원되지 않으며 ALTER TABLE ALTER COLUMN 으로 변환됩니다.

관련 EWIs

  1. SSC-EWI-0035: Check 문은 지원되지 않습니다.

  2. SSC-EWI-0040: 문은 지원되지 않습니다.

  3. 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); 
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

Known Issues

1. ALTER TABLE CHECK 절은 Snowflake에서 지원되지 않습니다.

ALTER TABLE CHECK 절 전체는 Snowflake에서 지원되지 않으므로 설명이 생략되어 있습니다.

관련 EWIs

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

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

Known Issues

1. ALTER TABLE DEFAULT 절은 Snowflake에서 지원되지 않습니다.

ALTER TABLE DEFAULT 절 전체는 Snowflake에서 지원되지 않으므로 설명이 생략되어 있습니다.

관련 EWIs

  1. 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 ]
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 서버

 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

참고

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);
Copy
 ALTER TABLE table_name
ADD column_name INTEGER
CONSTRAINT constraint_name UNIQUE;
Copy

알려진 문제

문제가 발견되지 않았습니다.

관련 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" } ]   
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 서버

 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

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

COLLATE

데이터 정렬을 사용하면 문자열 비교에 대해 더 광범위한 규칙을 지정할 수 있습니다.

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

데이터 정렬 규칙 명명법은 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 ***/;
Copy

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) ' );
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 서버
 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 서버
 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 서버
 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 에 대한 변환을 보여줍니다. NOT FOR REPLICATION 부분은 Snowflake에서 제거됩니다.

SQL 서버
 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 서버
 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 서버에서 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;
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 서버
 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

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

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

  • [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 )  
}  
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 서버

설명

참고

출력 코드의 일부 부분은 명확성을 위해 생략되었습니다.

ALTER 문에 CHECK 절이 있는 경우, 지원되지 않으므로 Snowconvert는 전체 문을 설명합니다.

샘플 소스 패턴

SQL 서버

 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

Known Issues

1. ALTER TABLE CHECK 절은 Snowflake에서 지원되지 않습니다.

ALTER TABLE CHECK 절 전체는 Snowflake에서 지원되지 않으므로 설명이 생략되어 있습니다.

관련 EWIs

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 ]
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 서버

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

 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

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

샘플 소스 패턴

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);
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 서버

  • [x] Azure 시냅스 분석

설명

이 문은 SQLServer 에서 null 값과 함께 사용할 때 비교 연산자 같음 및 같지 않음에 대한 ISO 준수 동작을 지정합니다. 이 문에 대한 자세한 내용은 SET ANSI_NULLS 을 참조하십시오.

Transact-SQL 구문

 SET ANSI_NULLS { ON | OFF }
Copy

샘플 소스 패턴

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;
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 인 경우 같음(=) 및 같지 않음(<>) 비교 연산자는 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;
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에서 동작이 다를 수 있습니다.