CREATE SCHEMA(Transact-SQL)

적용 대상: SQL Server(지원되는 모든 버전) Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System(PDW)

현재 데이터베이스에 스키마를 만듭니다. CREATE SCHEMA 트랜잭션에서는 새 스키마 내에 테이블과 뷰를 만들고 해당 개체에 대한 GRANT, DENY 또는 REVOKE 권한을 설정할 수도 있습니다.

Topic link iconTransact-SQL 구문 규칙

Syntax

-- Syntax for SQL Server and Azure SQL Database  
  
CREATE SCHEMA schema_name_clause [ <schema_element> [ ...n ] ]  
  
<schema_name_clause> ::=  
    {  
    schema_name  
    | AUTHORIZATION owner_name  
    | schema_name AUTHORIZATION owner_name  
    }  
  
<schema_element> ::=   
    {   
        table_definition | view_definition | grant_statement |   
        revoke_statement | deny_statement   
    }  
-- Syntax for Azure Synapse Analytics and Parallel Data Warehouse  
  
CREATE SCHEMA schema_name [ AUTHORIZATION owner_name ] [;]  

참고

SQL Server 2014 이전 버전의 Transact-SQL 구문을 보려면 이전 버전 설명서를 참조하세요.

인수

schema_name
데이터베이스 내에서 스키마를 식별하는 이름입니다.

AUTHORIZATION owner_name
스키마를 소유하게 될 데이터베이스 수준 보안 주체의 이름을 지정합니다. 이 보안 주체는 다른 스키마를 소유할 수 있으며 현재 스키마를 기본 스키마로 사용하지 않을 수도 있습니다.

table_definition
스키마 내에서 테이블을 만드는 CREATE TABLE 문을 지정합니다. 이 문을 실행하는 보안 주체에게 현재 데이터베이스에 대한 CREATE TABLE 권한이 있어야 합니다.

view_definition
스키마 내에서 뷰를 만드는 CREATE VIEW 문을 지정합니다. 이 문을 실행하는 보안 주체에게 현재 데이터베이스에 대한 CREATE VIEW 권한이 있어야 합니다.

grant_statement
새 스키마를 제외한 모든 보안 개체에 대한 사용 권한을 부여하는 GRANT 문을 지정합니다.

revoke_statement
새 스키마를 제외한 모든 보안 개체에 대한 사용 권한을 취소하는 REVOKE 문을 지정합니다.

deny_statement
새 스키마를 제외한 모든 보안 개체에 대한 사용 권한을 거부하는 DENY 문을 지정합니다.

설명

참고

CREATE SCHEMA AUTHORIZATION을 포함하지만 이름을 지정하지 않는 문은 이전 버전과의 호환성을 위해서만 허용됩니다. 이 문은 오류를 일으키지 않지만 스키마를 만들지는 않습니다.

CREATE SCHEMA는 스키마와 이에 포함된 테이블 및 뷰를 만들 수 있으며 단일 문에서 모든 보안 개체에 대한 GRANT, REVOKE 또는 DENY 권한을 만들 수 있습니다. 이 문은 별도의 일괄 처리로 실행해야 합니다. CREATE SCHEMA 문으로 만드는 개체는 생성되는 스키마 내부에 생성됩니다.

CREATE SCHEMA 트랜잭션은 원자성을 갖습니다. CREATE SCHEMA 문을 실행하는 동안 오류가 발생하는 경우 지정한 보안 개체는 생성되지 않으며 사용 권한은 부여되지 않습니다.

CREATE SCHEMA로 만든 보안 개체는 다른 뷰를 참조하는 뷰를 제외하면 순서에 관계없이 나열할 수 있습니다. 다른 뷰를 참조하는 뷰의 경우에는 참조하는 뷰보다 참조되는 뷰를 먼저 만들어야 합니다.

따라서 GRANT 문은 개체를 만들기 전에 개체에 대한 사용 권한을 부여할 수 있으며 CREATE VIEW 문은 뷰가 참조하는 테이블을 만드는 CREATE TABLE 문에 앞서 표시될 수 있습니다. 또한 CREATE TABLE 문은 CREATE SCHEMA문에 나중에 정의된 테이블에 대한 외래 키를 선언할 수 있습니다.

참고

CREATE SCHEMA 문 내에서 DENY 및 REVOKE를 사용할 수 있습니다. DENY 및 REVOKE 절은 CREATE SCHEMA 문에 표시되는 순서대로 실행됩니다.

CREATE SCHEMA를 실행하는 보안 주체는 다른 데이터베이스 보안 주체를 생성될 스키마의 소유자로 지정할 수 있습니다. 이렇게 하려면 이 항목의 뒷부분에 나오는 "사용 권한" 섹션에서 설명하는 추가 사용 권한이 필요합니다.

새 스키마는 데이터베이스 수준 보안 주체인 데이터베이스 사용자, 데이터베이스 역할 또는 애플리케이션 역할 중 하나가 소유합니다. 스키마 내에서 만든 개체는 스키마 소유자가 소유하며 sys.objectsprincipal_id가 NULL입니다. 스키마 포함 개체의 소유권을 모든 데이터베이스 수준 보안 주체에게 이전할 수 있지만 스키마 소유자는 항상 스키마 내의 개체에 대한 CONTROL 권한을 갖고 있어야 합니다.

주의

SQL Server 2005부터 스키마 동작이 변경되었습니다. 이에 따라 스키마가 데이터베이스 사용자와 같다고 가정하는 코드에서 올바른 결과가 반환되지 않을 수 있습니다. sysobjects를 비롯한 이전 카탈로그 뷰는 CREATE SCHEMA, ALTER SCHEMA, DROP SCHEMA, CREATE USER, ALTER USER, DROP USER, CREATE ROLE, ALTER ROLE, DROP ROLE, CREATE APPROLE, ALTER APPROLE, DROP APPROLE, ALTER AUTHORIZATION 중 하나의 DDL 문이 사용된 적이 있는 데이터베이스에서는 사용할 수 없습니다. 이러한 데이터베이스에서는 새 카탈로그 뷰를 대신 사용해야 합니다. 새 카탈로그 뷰에서는 SQL Server 2005에 도입된 보안 주체와 스키마의 분리를 고려하고 있습니다. 카탈로그 뷰에 대한 자세한 내용은 카탈로그 뷰(Transact-SQL)를 참조하십시오.

암시적 스키마 및 사용자 만들기

일부 경우에 사용자는 데이터베이스 사용자 계정(데이터베이스의 데이터베이스 보안 주체)이 없더라도 데이터베이스를 사용할 수 있습니다. 이는 다음과 같은 상황에서 발생할 수 있습니다.

  • 로그인에 CONTROL SERVER 권한이 있습니다.

  • Windows 사용자는 개별 데이터베이스 사용자 계정(데이터베이스의 데이터베이스 보안 주체)을 갖지 않지만 데이터베이스 사용자 계정(Windows 그룹용 데이터베이스 보안 주체)을 갖는 Windows 그룹의 구성원으로 데이터베이스에 액세스합니다.

데이터베이스 사용자 계정이 없는 사용자는 기존 스키마를 지정하지 않고 개체를 만들 경우 해당 사용자에 대한 데이터베이스 보안 주체 및 기본 스키마가 데이터베이스에 자동으로 생성됩니다. 생성된 데이터베이스 보안 주체 및 스키마는 SQL Server에 연결할 때 사용자가 사용한 이름과 동일한 이름(SQL Server 인증 로그인 이름 또는 Windows 사용자 이름)을 사용합니다.

이 동작은 Windows 그룹에 속한 사용자가 개체를 만들어 소유할 수 있도록 허용하므로 필요합니다. 그러나 스키마 및 사용자가 의도하지 않게 생성될 수 있습니다. 의도하지 않은 사용자 및 스키마 생성을 방지하려면 가능한 경우 데이터베이스 보안 주체를 명시적으로 만들어 기본 스키마를 할당하세요. 또는 데이터베이스에서 개체를 만들 때 두, 세 부분으로 구성된 개체 이름을 사용하여 기존 스키마를 명시적으로 지정합니다.

참고

Azure Active Directory 사용자의 암시적 생성은 SQL Server에서 가능하지 않습니다. 외부 공급자에서 Azure AD 사용자를 생성하면 AAD에서 사용자 상태를 확인해야 하므로 사용자 생성은 오류 2760: 지정된 스키마 이름 "<user_name@domain>"이 존재하지 않거나 사용할 권한이 없습니다. 및 오류 2759: 이전 오류로 인해 CREATE SCHEMA가 실패했습니다.와 함께 실패합니다. 이러한 오류를 해결하려면 먼저 외부 공급자로부터 Azure AD 사용자를 만든 다음 개체를 만드는 문을 다시 실행합니다.

사용 중단 고지 사항

스키마 이름을 지정하지 않는 CREATE SCHEMA 문은 이전 버전과의 호환성을 위해 현재 지원됩니다. 이 문은 데이터베이스 내부에 실제로 스키마를 만들지는 않지만 테이블과 뷰를 만들고 사용 권한을 부여합니다. 스키마가 생성되지 않기 때문에 보안 주체에게는 이러한 이전 형식의 CREATE SCHEMA를 실행하는 데 CREATE SCHEMA 권한이 필요하지 않습니다. SQL Server의 다음번 릴리스에서는 이 기능이 제거될 예정입니다.

사용 권한

데이터베이스에 대한 CREATE SCHEMA 권한이 필요합니다.

CREATE SCHEMA 문 내에서 지정한 개체를 만들려면 사용자에게 해당 CREATE 권한이 있어야 합니다.

다른 사용자를 생성되는 스키마의 소유자로 지정하려면 호출자에게 해당 사용자에 대한 IMPERSONATE 권한이 있어야 합니다. 데이터베이스 역할을 소유자로 지정하는 경우 호출자에게 해당 역할의 멤버 자격이나 해당 역할에 대한 ALTER 권한이 있어야 합니다.

참고

이전 버전과 호환되는 구문을 사용하면 스키마가 생성되지 않기 때문에 CREATE SCHEMA 권한이 확인되지 않습니다.

예제

A. 스키마 만들기 및 사용 권한 부여

다음 예에서는 Sprockets가 소유하고 Annik 테이블을 포함하는 NineProngs 스키마를 만듭니다. 이 문에서는 SELECT에게 Mandar 권한을 부여하고 SELECT에게는 Prasanna 권한을 거부합니다. SprocketsNineProngs는 단일 문으로 생성됩니다.

USE AdventureWorks2012;  
GO  
CREATE SCHEMA Sprockets AUTHORIZATION Annik  
    CREATE TABLE NineProngs (source int, cost int, partnumber int)  
    GRANT SELECT ON SCHEMA::Sprockets TO Mandar  
    DENY SELECT ON SCHEMA::Sprockets TO Prasanna;  
GO   

예: Azure Synapse Analytics 및 분석 플랫폼 시스템(PDW)

B. 스키마 및 스키마에 테이블 만들기

다음 예에서는 Sales 스키마를 만든 다음, 해당 스키마에 Sales.Region 테이블을 만듭니다.

CREATE SCHEMA Sales;  
GO
  
CREATE TABLE Sales.Region   
(Region_id INT NOT NULL,  
Region_Name CHAR(5) NOT NULL)  
WITH (DISTRIBUTION = REPLICATE);  
GO  

C. 스키마 소유자 설정

다음 예에서는 Mary가 소유한 Production 스키마를 만듭니다.

CREATE SCHEMA Production AUTHORIZATION [Contoso\Mary];  
GO  

참고 항목

ALTER SCHEMA(Transact-SQL)
DROP SCHEMA (Transact-SQL)
GRANT(Transact-SQL)
DENY(Transact-SQL)
REVOKE(Transact-SQL)
CREATE VIEW(Transact-SQL)
EVENTDATA(Transact-SQL)
sys.schemas(Transact-SQL)
데이터베이스 스키마 만들기