다음을 통해 공유


SQL Server의 소유권 및 사용자 스키마 분리

적용 대상: Microsoft Fabric의 SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System(PDW) SQL 데이터베이스

SQL Server 보안의 주요 개념은 개체 소유자에게 취소할 수 없는 개체 관리 권한이 있다는 것입니다. 개체 소유자의 권한을 제거할 수 없으며 사용자가 데이터베이스의 개체를 소유하는 경우 데이터베이스에서 사용자를 삭제할 수 없습니다.

사용자 스키마 분리

사용자 스키마 분리를 통해 데이터베이스 개체 권한을 더욱 유연하게 관리할 수 있습니다. 스키마는 개체를 별도의 네임스페이스로 그룹화할 수 있는 데이터베이스 개체의 명명된 컨테이너입니다. 예를 들어, AdventureWorks 샘플 데이터베이스에는 Production, Sales 및 HumanResources에 대한 스키마가 들어 있습니다.

개체를 참조하는 4부분으로 구성된 명명 구문은 스키마 이름을 지정합니다.

Server.Database.DatabaseSchema.DatabaseObject

스키마 소유자 및 권한

스키마는 데이터베이스 보안 주체가 소유할 수 있으며, 단일 보안 주체가 여러 스키마를 소유할 수 있습니다. 스키마의 모든 개체에서 상속된 보안 규칙을 스키마에 적용할 수 있습니다. 스키마에 대한 액세스 권한을 설정했으면 새 개체가 스키마에 추가되었으므로 이러한 권한이 자동으로 적용됩니다. 사용자는 기본 스키마에 할당되며 여러 데이터베이스 사용자가 동일한 스키마를 공유할 수 있습니다.

개발자가 스키마에서 개체를 만들 때 기본적으로 개발자가 아닌 스키마를 소유하는 보안 주체가 개체를 소유합니다. 개체 소유권은 ALTER AUTHORIZATION Transact-SQL 문을 사용하여 전송할 수 있습니다. 스키마는 다른 사용자가 소유하고 스키마에 할당된 권한보다 세부적인 권한을 가지는 개체도 포함할 수 있지만 권한 관리가 복잡해지므로 이 방법은 권장하지 않습니다. 스키마 사이에 개체를 제거할 수 있으며 보안 주체 사이에 스키마 소유권을 전송할 수 있습니다. 스키마에 영향을 주지 않고 데이터베이스 사용자를 삭제할 수 있습니다.

이전 버전과의 호환성을 위한 기본 제공 스키마

SQL Server에는 db_accessadmin, db_backupoperator, db_datareader, db_datawriter, db_ddladmin, db_denydatareader, db_denydatawriter, db_owner, db_securityadmin 등 기본 제공 데이터베이스 사용자 및 역할과 동일한 이름을 갖는 9개의 미리 정의된 스키마가 제공됩니다. 이는 이전 버전과의 호환성을 위해 존재합니다. 사용자 개체에는 사용하지 않는 것이 좋습니다. 이미 사용 중인 스키마가 아니라면 고정 데이터베이스 역할과 이름이 같은 스키마를 삭제할 수 있으며, 이 경우 DROP 명령은 오류를 반환하고 사용 중인 스키마의 삭제를 차단합니다.

IF EXISTS (SELECT * FROM sys.schemas WHERE name = N'db_accessadmin')
DROP SCHEMA [db_accessadmin]
GO

IF EXISTS (SELECT * FROM sys.schemas WHERE name = N'db_backupoperator')
DROP SCHEMA [db_backupoperator]
GO

IF EXISTS (SELECT * FROM sys.schemas WHERE name = N'db_datareader')
DROP SCHEMA [db_datareader]
GO

IF EXISTS (SELECT * FROM sys.schemas WHERE name = N'db_datawriter')
DROP SCHEMA [db_datawriter]
GO

IF EXISTS (SELECT * FROM sys.schemas WHERE name = N'db_ddladmin')
DROP SCHEMA [db_ddladmin]
GO

IF EXISTS (SELECT * FROM sys.schemas WHERE name = N'db_denydatareader')
DROP SCHEMA [db_denydatareader]
GO

IF  EXISTS (SELECT * FROM sys.schemas WHERE name = N'db_denydatawriter')
DROP SCHEMA [db_denydatawriter]
GO

IF  EXISTS (SELECT * FROM sys.schemas WHERE name = N'db_owner')
DROP SCHEMA [db_owner]
GO

IF EXISTS (SELECT * FROM sys.schemas WHERE name = N'db_securityadmin')
DROP SCHEMA [db_securityadmin]
GO

model 데이터베이스에서 이러한 스키마를 삭제하면 새 데이터베이스에 나타나지 않습니다. 개체가 포함된 스키마는 삭제할 수 없습니다.

다음 스키마는 삭제할 수 없습니다.

  • dbo
  • guest
  • sys
  • INFORMATION_SCHEMA

참고 항목

sysINFORMATION_SCHEMA 스키마는 시스템 개체용으로 예약되어 있습니다. 이러한 스키마의 개체는 만들거나 삭제할 수 없습니다.

dbo 스키마

dbo 스키마는 모든 데이터베이스의 기본 스키마입니다. CREATE USER Transact-SQL 명령을 사용하여 만들어진 사용자는 기본적으로 dbo를 기본 스키마로 가집니다. dbo 스키마는 dbo 사용자 계정에서 소유합니다.

기본 스키마로 dbo를 할당받은 사용자는 dbo 사용자 계정의 권한을 상속받지 않습니다. 사용자에게는 스키마의 권한이 상속되지 않고 스키마에 포함된 데이터베이스 개체의 스키마 권한이 상속됩니다. 사용자의 기본 스키마는 사용자가 객체를 쿼리할 때 스키마를 생략하는 경우에 대비하여 객체 참조에만 사용됩니다.

참고 항목

한 부분으로 구성된 이름을 사용하여 데이터베이스 개체를 참조할 때 SQL Server에서는 먼저 사용자의 기본 스키마를 찾습니다. 개체를 기본 스키마에서 찾을 수 없으면 SQL Server는 dbo 스키마에서 찾습니다. 개체가 dbo 스키마에 없는 경우 오류가 반환됩니다.