동료가 자신의 스키마를 어떻게 얻었습니까?


14

저장 프로 시저가 있습니다.

  • 테이블이 존재하는지 확인하고 존재하면 삭제합니다.
  • 그 테이블을 다시 만듭니다
  • 그런 다음 약 30 개의 쿼리로 해당 테이블을 채 웁니다.

내가 (DB 소유자)이 proc을 실행할 때 모든 것이 의도 한대로 작동합니다. 내 동료가 Active Directory의 역할을 통해이 데이터베이스에 대한 DROP / CREATE 권한을 가진 사람이 그렇게하면 몇 가지 문제가 발생합니다. 내 마음을 괴롭히는 것은 이것입니다 :

테이블 작성시 dbo이름 앞에 명시 적으로 지정된 스키마 가 없습니다 . 결과적으로 table이라는 domain\cowork_id.table_name_here테이블이 작성되었습니다. 개인 스키마에서 생성 된 테이블 외에도 이제 데이터베이스에 해당 스키마가 있습니다 (프로세스를 실행하기 전에 존재하지 않았습니다).

어떻게 된 거예요? SQL Server dbo가 지정되지 않은 경우가 아닌 사용자의 스키마에 테이블을 만드는 이유는 무엇 입니까?


답변:


26

일반적 으로이 스키마에서 개체를 만들려면 스키마를 명시 적으로 지정 해야합니다 dbo.

현재 db_owner기본 스키마는 dbo이므로 개체를 만드는 동안 dbo 스키마를 지정하지 않아도 문제가 없습니다. 그러나 다른 (Windows) 사용자에게는 동일하지 않습니다.

사용자는 Windows group기본 스키마가없는 멤버입니다 . 이 경우 사용자가 개체를 만들 때 해당 사용자와 스키마가 만들어지며 여기에 문서화되어 있습니다. CREATE SCHEMA (Transact-SQL)

암시 적 스키마 및 사용자 생성

경우에 따라 사용자는 데이터베이스 사용자 계정 (데이터베이스의 데이터베이스 주체)없이 데이터베이스를 사용할 수 있습니다. 다음 상황에서 발생할 수 있습니다.

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

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

데이터베이스 사용자 계정이없는 사용자가 기존 스키마를 지정하지 않고 개체를 만들면 해당 사용자의 데이터베이스에 데이터베이스 주체 및 기본 스키마가 자동으로 만들어집니다. 작성된 데이터베이스 프린시 펄 및 스키마는 사용자가 SQL Server에 연결할 때 사용한 이름 (SQL Server 인증 로그인 이름 또는 Windows 사용자 이름)과 동일한 이름을 갖습니다.

Windows 그룹 기반 사용자가 오브젝트를 작성하고 소유 할 수있게하려면이 동작이 필요합니다. 그러나 의도하지 않은 스키마 및 사용자 작성이 발생할 수 있습니다. 암시 적으로 사용자 및 스키마를 작성하지 않으려면 가능할 때마다 명시 적으로 데이터베이스 프린시 펄을 작성하고 기본 스키마를 지정하십시오. 또는 두 부분 또는 세 부분으로 된 개체 이름을 사용하여 데이터베이스에서 개체를 만들 때 기존 스키마를 명시 적으로 명시하십시오.

이 문제를 해결하려면 모든 yor 사용자 -Windows 그룹에 dbo스키마를 지정 default schema하거나 객체를 만들 때 스키마를 명시 적으로 작성하십시오. 항상.

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