포함 된 데이터베이스에 단점이 있습니까?


33

SQL Server 2012는 데이터베이스에 필요한 모든 것 (주로 모든 것)이 데이터베이스 자체에 포함되어있는 "포함 된"데이터베이스 개념을 도입했습니다. 이는 서버간에 데이터베이스를 이동할 때 큰 이점을 제공합니다. 그렇다면 새 데이터베이스를 디자인 할 때 이것이 기본 전략이어야하는지 알고 싶습니다.

MSDN에는 포함 된 데이터베이스에 대한 몇 가지 단점이 있으며, 큰 데이터베이스는 변경 내용 추적 및 복제에 대한 지원이 부족합니다. 다른 사람이 있습니까? 이러한 기능을 사용하지 않을 경우 포함 된 데이터베이스를 사용하지 않는 이유가 있습니까?

답변:


33

포함 된 데이터베이스의 주된 목적은 많은 비계없이 데이터베이스를 새 서버로 쉽게 이식 할 수 있도록하는 것입니다. 이를 염두에두고이 마이그레이션을 더욱 어렵게 만드는 몇 가지 잠재적 인 문제를 다루겠습니다. 포함 된 데이터베이스가 SQL Server 2012에 일부만 포함되어 있다는 사실을 중심으로 설명합니다 (실제로 적용되지는 않음).


연결 문자열

포함 된 데이터베이스에 대한 연결 문자열은 연결 문자열에 데이터베이스 명시 적으로 지정 해야 합니다. 더 이상 로그인의 기본 데이터베이스를 사용하여 연결을 설정할 수 없습니다. 데이터베이스를 지정하지 않으면 SQL Server는 포함 된 모든 데이터베이스를 단계별로 실행하지 않고 자격 증명이 일치 할 수있는 데이터베이스를 찾으려고 시도합니다.


데이터베이스 간 쿼리

동일한 서버의 서로 다른 두 개의 포함 된 데이터베이스에서 동일한 비밀번호로 동일한 사용자를 작성하더라도 애플리케이션이 데이터베이스 간 쿼리를 수행 할 수 없습니다. 사용자 이름과 비밀번호는 동일 할 수 있지만 동일한 사용자 는 아닙니다 . 그 이유는 무엇입니까? 호스팅 된 서버에 데이터베이스가 포함 된 경우 동일한 호스팅 된 서버를 사용하는 다른 사용자와 동일한 포함 된 사용자를 가질 수 없습니다. 완전 봉쇄 가능성 (도착하면 SQL 서버 2012 이후 버전에서 결코) 데이터베이스 간 쿼리는 절대로 금지됩니다. 포함 된 데이터베이스 사용자와 동일한 이름으로 서버 수준 로그인을 작성하지 않고 포함 된 데이터베이스에서 동일한 포함 된 사용자 이름을 작성하지 않도록하는 것이 좋습니다. 포함 된 여러 데이터베이스에 충돌하는 쿼리를 실행해야하는 경우 적절한 권한이있는 서버 수준 로그인을 사용하십시오 (이것은 sysadmin읽기 전용 쿼리 인 경우는 CONNECT ANY DATABASESELECT ALL USER SECURABLES).


동의어

대부분의 3 부 및 4 부 이름은 식별하기 쉽고 DMV에 나타납니다. 그러나 3 개 또는 4 개 부품 이름을 가리키는 동의어를 작성하면 DMV에 표시되지 않습니다. 따라서 동의어를 많이 사용하면 일부 외부 종속성이 누락 될 수 있으며 데이터베이스를 다른 서버로 마이그레이션하는 시점에서 문제가 발생할 수 있습니다. 이 문제에 대해 불평했지만 "디자인 상"으로 닫히고 새로운 피드백 시스템으로 의 마이그레이션에서 살아남지 못했습니다 . DMV에는 동적 SQL을 통해 생성 된 3 및 4 부분 이름도 누락됩니다.


비밀번호 정책

비밀번호 정책이없는 시스템에서 포함 된 데이터베이스 사용자를 작성한 경우, 비밀번호 정책이있는 다른 시스템에서 동일한 사용자를 작성하기가 어려울 수 있습니다. CREATE USER구문은 비밀번호 정책 우회를 지원하지 않기 때문 입니다. 이 문제에 대한 버그를 신고했으며 계속 열려 있습니다 (또한 Connect가 종료 될 때도 계속 살아남지 못했습니다). 암호 정책이 적용된 시스템에서 정책을 쉽게 우회하는 서버 수준 로그인을 만들 수는 있지만이 사용자는 본질적으로 그렇게해도 데이터베이스 사용자를 만들 수는 없습니다. 보안 위험이 적습니다.


대조

더 이상 tempdb의 데이터 정렬에 의존 할 수 없으므로 현재 명시 적 데이터 정렬 DATABASE_DEFAULT을 사용 하거나 CATALOG_DEFAULT대신 사용하는 코드를 변경해야 할 수도 있습니다 . 잠재적 인 문제에 대해서는 이 BOL 기사를 참조하십시오 .


IntelliSense

포함 된 사용자로 포함 된 데이터베이스에 연결하면 SSMS가 IntelliSense를 완전히 지원하지 않습니다. 구문 오류에 대한 기본 밑줄이 표시되지만 자동 완성 목록이나 툴팁 및 모든 재미있는 내용은 없습니다. 나는이 문제에 대한 버그를 제기했으며, 여전히 열려 있으며 그 중 하나 는 여전히 살아남지 못했습니다.


SQL Server 데이터 도구

데이터베이스 개발에 SSDT를 사용하려는 경우 현재 포함 된 데이터베이스를 완전히 지원하지 않습니다. SSDT는 현재 어떤 봉쇄가 무엇이며 어떤 봉쇄가 무엇인지 알지 못하기 때문에 봉쇄를 깨는 기능이나 구문을 사용하면 프로젝트를 구축하는 데 실패하지 않습니다.


데이터베이스 변경

ALTER DATABASE포함 된 데이터베이스의 컨텍스트 내에서 명령을 실행할 때는 rR ALTER DATABASE foo을 사용해야 ALTER DATABASE CURRENT합니다. 데이터베이스를 이동하거나 이름을 바꾸는 등의 경우 이러한 명령은 외부 컨텍스트 나 참조에 대해 아무것도 알 필요가 없습니다. .


다른 몇

아직 사용하지 말아야하지만 지원되지 않거나 더 이상 사용되지 않으며 포함 된 데이터베이스에서 사용해서는 안되는 목록에서 언급해야합니다.

  • 번호가 매겨진 절차
  • 임시 절차
  • 바인딩 된 개체의 데이터 정렬 변경
  • 데이터 캡처 변경
  • 변경 추적
  • 복제

이 모든 것이 포함 된 데이터베이스를 사용하는 데 반드시 불리한 것은 아니며 공식 문서에 명시 적으로 공개되어 있지는 않습니다.

또한 포함 된 데이터베이스가 마이그레이션되거나 가용성 그룹의 일부이거나 미러링되는 경우 모든 잠재적 대상 서버의 sp_configure옵션 contained database authentication이 1로 설정되어 있는지 확인 해야합니다 .

당신은 찾을 수 이 블로그 게시물 유용뿐만 아니라 이 하나 가 RTM-날짜 사전에도 불구하고.


임시 절차가 허용되지 않는 이유를 알고 있습니까?
Jon Seigel

2
@JonSeigel 여전히 부분적 격리가 허용되지만 격리를 위반합니다 (메타 데이터 및 정의가 다른 곳에 저장되어 있기 때문에 프로 시저가 액세스하는 엔티티를 검증 할 방법이 없음을 의미). 에서 msdn.microsoft.com/en-us/library/ff929071.aspx#Limitations : 임시 저장 프로 시저가 현재 허용됩니다. 임시 저장 프로 시저가 포함을 위반하므로 이후 버전의 포함 된 데이터베이스에서는 지원되지 않을 것입니다.
Aaron Bertrand

9

포함 된 데이터베이스에 대한 자세한 내용을 알고 싶은 사람들은이 기사 http://www.sqlshack.com/contained-databases-in-sql-server/ 를 읽어 보는 것이 좋습니다 .

이 기사는 포함 된 데이터베이스 사용의 주요 장점 / 단점을 정확하게 지적합니다.

단점

부분적으로 포함 된 데이터베이스는 데이터 정렬 변경 기능이 내장 된 내장 함수에 의존하는 복제, 변경 데이터 캡처, 변경 추적, 스키마 바운드 개체와 같은 기능을 사용할 수 없습니다.

장점

반면에 이미 언급했듯이 포함 된 DB를 사용하면 다음과 같은 이점이 있습니다.


  • 분리 된 사용자 문제가 없으므로 한 서버에서 다른 서버로 데이터베이스를 이동하는 것은 매우 쉽습니다.
  • 메타 데이터는 포함 된 데이터베이스에 저장되므로 더 쉽고 이식성이 뛰어납니다.
  • 포함 된 DB 사용자에 대해 SQL Server 및 Windows 인증을 모두 사용할 수 있습니다.

이 기사는 또한 다음을 도와줍니다.

  • 포함 된 새 데이터베이스 만들기 (SQL Server의 옵션 페이지에서 포함 형식을 부분으로 만들고 나중에 T-SQL 쿼리를 사용하여 데이터베이스 만들기)
  • SQL Server Management Studio를 사용하여 포함 된 DB에 연결 (연결 매개 변수에 포함 된 DB 이름을 지정해야 함)
  • 기존 데이터베이스를 포함 된 데이터베이스로 변환
  • 포함 된 데이터베이스에서 작업하고 포함 된 사용자 유형의 모든 로그인을 나열

4

한 가지 단점은 포함 된 데이터베이스 사용자가 로그인과 같이 자신의 암호를 강제로 변경할 수 없다는 것입니다 ( MUST_CHANGE). 사용자에게 대체 사용자 권한을 부여하고 SQL 문을 사용하여 변경하는 방법을 알려주지 않으면 사용자는 자신의 암호를 관리 할 수 ​​없습니다. 사용자 인터페이스를 통해 쉽게 관리 할 수있는 방법은 없습니다.

또한 "PIVOT"및 "UNPIVOT"절에서 시스템 카탈로그 (sys.tables / sys.columns / etc)에만있는 것으로 생각되는 예기치 않은 문서화되지 않은 메타 데이터 사용을 발견했습니다. msdn에 설명 된대로 :

포함 된 데이터베이스에서 카탈로그 정렬 Latin1_General_100_CI_AS_WS_KS_SC . 이 데이터 정렬은 모든 SQL Server 인스턴스에 포함 된 모든 데이터베이스에 대해 동일하며 변경할 수 없습니다.

그러나 "PIVOT"및 "UNPIVOT"절은 시스템 카탈로그를 실행 메커니즘으로 사용한다고 언급하지 않았습니다. 따라서 마이그레이션 중에 "PIVOT"및 "UNPIVOT"절을 사용하는 곳 근처에서 데이터 정렬 충돌 오류가 발생합니다. 여기에 몇 가지 생식이 있습니다 :

/*step1 create a table belongs to a contained database and populate some data*/
create  table dbo.test1 (col1 varchar(100),col2 varchar(100))
insert  dbo.test1 values('a','x')
insert  dbo.test1 values('b','y')
insert  dbo.test1 values('c','z')

/*step2 lets see its collation you will see it is correctly as same as its (contained) database */
select name,collation_name from sys.columns where object_name(object_id) = 'test1'

/*step3 reproduce an unpivoted column*/
select * into dbo.test2
from (select * from dbo.test1) a unpivot (val for col in (col1,col2)) a


/*step4 lets check its collation you will see the column specified at "FOR" clause is created as Latin1_General_100_CI_AS_KS_WS_SC */
select name,collation_name from sys.columns where object_name(object_id) = 'test2'

/*step5 make use of the unpivoted table without awareness will cause an error*/
select val + ' = ' + col from dbo.test2 

/*step6 clean up*/
drop table dbo.test1
drop table dbo.test2

포함 된 데이터베이스에 대한 기사가 대부분 불완전하다는 것을 알 수 있습니다. 사용을 결정하려면 즉흥 연주가 필요합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.