포함 된 데이터베이스의 주된 목적은 많은 비계없이 데이터베이스를 새 서버로 쉽게 이식 할 수 있도록하는 것입니다. 이를 염두에두고이 마이그레이션을 더욱 어렵게 만드는 몇 가지 잠재적 인 문제를 다루겠습니다. 포함 된 데이터베이스가 SQL Server 2012에 일부만 포함되어 있다는 사실을 중심으로 설명합니다 (실제로 적용되지는 않음).
연결 문자열
포함 된 데이터베이스에 대한 연결 문자열은 연결 문자열에 데이터베이스 를 명시 적으로 지정 해야 합니다. 더 이상 로그인의 기본 데이터베이스를 사용하여 연결을 설정할 수 없습니다. 데이터베이스를 지정하지 않으면 SQL Server는 포함 된 모든 데이터베이스를 단계별로 실행하지 않고 자격 증명이 일치 할 수있는 데이터베이스를 찾으려고 시도합니다.
데이터베이스 간 쿼리
동일한 서버의 서로 다른 두 개의 포함 된 데이터베이스에서 동일한 비밀번호로 동일한 사용자를 작성하더라도 애플리케이션이 데이터베이스 간 쿼리를 수행 할 수 없습니다. 사용자 이름과 비밀번호는 동일 할 수 있지만 동일한 사용자 는 아닙니다 . 그 이유는 무엇입니까? 호스팅 된 서버에 데이터베이스가 포함 된 경우 동일한 호스팅 된 서버를 사용하는 다른 사용자와 동일한 포함 된 사용자를 가질 수 없습니다. 완전 봉쇄 가능성 (도착하면 SQL 서버 2012 이후 버전에서 결코) 데이터베이스 간 쿼리는 절대로 금지됩니다. 포함 된 데이터베이스 사용자와 동일한 이름으로 서버 수준 로그인을 작성하지 않고 포함 된 데이터베이스에서 동일한 포함 된 사용자 이름을 작성하지 않도록하는 것이 좋습니다. 포함 된 여러 데이터베이스에 충돌하는 쿼리를 실행해야하는 경우 적절한 권한이있는 서버 수준 로그인을 사용하십시오 (이것은 sysadmin
읽기 전용 쿼리 인 경우는 CONNECT ANY DATABASE
및 SELECT 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-날짜 사전에도 불구하고.