필자는이 기사에 제공된 표 ( http://msdn.microsoft.com/en-us/library/ms178569.aspx)의 도움을 받아 정식 답변을 찾았다 고 생각합니다 . CREATE DATABASE는 실제로 ANSI SQL 호환 권한 인 반면 CREATE ANY DATABASE는 MSSQL 독점 서버 권한입니다. 그러나 둘은 동일하지 않습니다. 사실, 둘 사이에는 다소 중요한 차이점이 있습니다.
둘 다 권한이지만 CREATE DATABASE는 현재 사용되는 데이터베이스의 보안 컨텍스트 만 참조하지만 CREATE ANY DATABASE는 SQL Server에서 로그인 목록을 조회 할 수 있습니다. ANSI SQL 서버에 대한 일반적인 기대는 일부 기본 시스템 데이터베이스에서 권한이 부여되고 해당 데이터베이스의 사용자에게 권한이 부여되기 때문에 구현 된 것으로 보입니다. 그런 다음 새 데이터베이스의 기본 동작은 마스터에게 문의하여 어떤 권한을 상속해야하는지 확인하는 것입니다. (SQL 101, 알고 있지만 실제로 여기에 예시되어 있습니다.)
따라서 CREATE DATABASE를 부여 할 때 실제로이 권한을 부여하려면 마스터에 사용자가 있어야합니다. 이것을 시도하면 작동합니다 (마스터에서 사용자 생성, 데이터베이스 생성 허용, 데이터베이스 생성 가능). 그러나 데이터베이스 작성 (또는 dbcreator 역할 부여)을 부여하면 master의 리터럴 사용자 일 필요는 없습니다.
두 권한의 차이점을 더 설명하기 위해 master와 다른 데이터베이스에 사용자 CREATE DATABASE를 부여하여 리턴 된 다른 메시지를 관찰 한 후 CREATE ANY DATABASE 권한에 대해 헹구고 반복하십시오.
use master; GRANT CREATE DATABASE to TestUser
메시지 15151, 수준 16, 상태 1, 줄 1 'TestUser'사용자가 없거나 권한이 없기 때문에 사용자를 찾을 수 없습니다.
이 오류는 TestUser 사용자가 아직 마스터 데이터베이스에 없기 때문에 발생합니다. 이것은 데이터베이스 수준의 권한입니다. 선택한 데이터베이스 외부로 이동하여 로그인 또는 사용자를 찾을 수있는 컨텍스트가 없습니다. master에서 사용자를 먼저 작성하면이 명령이 성공하고 CREATE ANY DATABASE가 부여 된 것처럼 데이터베이스를 작성할 수 있습니다.
use master; GRANT CREATE ANY DATABASE to TestUser
명령이 성공적으로 완료되었습니다.
독점적 인 Microsoft SQL Server 권한으로 CREATE ANY DATABASE가 현재 사용중인 데이터베이스의 사용자뿐만 아니라 SQL 인스턴스의 로그인 목록을 참조 할 수 있기 때문에 성공합니다.
use test; GRANT CREATE DATABASE to TestUser
메시지 15151, 수준 16, 상태 1, 줄 1 'TestUser'사용자가 없거나 권한이 없기 때문에 사용자를 찾을 수 없습니다.
이것은 첫 번째 예에 대한 설명의 일관성을 보여줍니다. 아래 쿼리와 결과 오류 메시지를 참고하십시오. 이 데이터베이스에서 사용자를 처음 작성하면이 오류 메시지가 표시되지 않습니다 (마지막 조회 참조).
use test; GRANT CREATE ANY DATABASE to TestUser
메시지 4621, 수준 16, 상태 10, 줄 1 서버 범위의 사용 권한은 현재 데이터베이스가 마스터 인 경우에만 부여 할 수 있습니다.
두 번째 쿼리에서 볼 수 있듯이 CREATE ANY DATABASE는 이미이 로그인 이름을 만든 로그인 목록을 참조합니다. 따라서 SQL Server는 사용자의 존재를 인정했지만 MSSQL에서는 허용되지 않는 master 이외의 서버 수준 권한을 부여하려고 시도하기 때문에 여전히 오류가 발생합니다.
use test; create user TestUser; grant create database to TestUser
CREATE DATABASE 권한은 마스터 데이터베이스에서만 부여 될 수 있습니다. 메시지 0, 수준 11, 상태 0, 줄 0 현재 명령에서 심각한 오류가 발생했습니다. 결과가 있으면 버려야합니다.
CREATE DATABASE에 적용 할 사용자가 있으므로 SQL Server가 이러한 권한을 저장하는 위치이므로 마스터 이외의 다른 서버 수준 권한을 부여 할 수 없다는 일반적인 오류 메시지가 나타납니다.
글쎄, 이것은 재미 있었다.