Windows 사용자가 테이블을 만들 때 SQL 2008 R2가 사용자 / 스키마를 만듭니다.


9

익명으로 이름이 변경된 다음 스크립트를 사용하여 Windows 그룹을 SQL 2008 R2 인스턴스에 매핑하는 서버 로그인 및 데이터베이스 사용자를 추가했습니다.

USE master
go
CREATE LOGIN [DOMAIN\AppUsers] FROM WINDOWS
WITH DEFAULT_DATABASE=[master], DEFAULT_LANGUAGE=[us_english]
go
USE AppDb
go
CREATE USER [DOMAIN\AppUsers] FOR LOGIN 
[DOMAIN\AppUsers]
go
EXEC sp_addrolemember N'db_owner', N'DOMAIN\AppUsers'
go

DOMAIN \ User1 계정이 앱에 로그온하면 User1이 DOMAIN \ AppUsers의 구성원이므로 User1이 dbo 스키마의 테이블을 올바르게 쿼리하지만이 앱을 통해 사용자도 테이블을 만들 수 있습니다. schema를 지정하지 않고 이러한 테이블 만들면 SQL Server는 다음을 수행합니다.

  1. 인스턴스의 SSMS \ Security \ Logins에 나열되지 않은 'DOMAIN \ User1'로그인을 사용하는 AppDb에 'DOMAIN \ User1'사용자를 만듭니다.
  2. AppDb에서 'DOMAIN \ User1'스키마를 만듭니다.
  3. 새로운 'DOMAIN \ User1'스키마를 사용하여 해당 테이블을 작성합니다.

나는이 결과로 완전히 당황했습니다. 내 질문은 다음과 같습니다.

  1. 추가 객체를 생성하는 대신 테이블 생성이 실패 할 것으로 예상합니다. 누군가 온라인 설명서에서이를 설명하는 부분을 알려줄 수 있습니까?
  2. 서버가 'DOMAIN \ AppUsers'스키마를 작성하고 스키마를 추가 할 경우 해당 스키마에 새 테이블을 추가하지 않는 이유는 무엇입니까?
  3. 또한 데이터베이스는 SSMS \ Security \ Logins에 표시되지 않은 로그인을 어떻게 사용합니까?
  4. SSMS \ Databases \ AppDb \ Security \ Users의 'DOMAIN \ User1'사용자를 보면 사용자 아이콘에 작은 빨간색 화살표가 아래쪽을 가리 킵니다. 그게 무슨 뜻이야?

우리는 단순성을 위해 SQL 인증을 선호하는 조직 내에서 Windows 인증을 사용하기 시작했습니다. 따라서 제 질문은 차이점을 모르는 것이 확실합니다. 이 코드는 Windows 인증 사용을 고려하기 오래 전에 작성되었으므로 데이터베이스 소유자 이외의 사람으로 Windows 인증을 사용하여 로그온 할 때 새 스키마 작성에 대한 이해를 향상시켜야합니다.

당신이 말할 수없는 경우, 나는 SQL 인증보다 Windows 인증의 사용을 추진하고 있습니다. 이를 잘 이해하지 못하면 SQL 인증으로 되돌아갑니다.


도메인 사용자에 대해서는 기본 스키마 {dbo, 예를 들어}를 정의 할 수 있지만 도메인 그룹에는 정의 할 수 없습니다.

답변:


9

이것은 항상 SQL Server 2000으로 돌아 왔습니다.
스키마가 없으면 SQL Server는 dbo스키마에 스키마 를 넣기를 어떻게 알 수 있습니까?

기본 스키마를 지정하는 유일한 방법은 다음과 같습니다.

  • SQL 로그인 사용 (Windows 아님)
  • "sysadmin"으로 실행

이들 중 어느 것도 허용되지 않습니다

모범 사례는 DDL 및 DML에 대한 모든 객체 참조에 대해 항상 스키마를 규정하는 것입니다. 계획 재사용으로 인해 명확한 성능 이점이 있습니다.

또한 SQL Server 2005에는 고의적 인 스키마 사용이 더 좋습니다.

  • 테이블 Data
  • 다른 테이블 Archive, Staging
  • 클라이언트 권한에 따라 스키마 코드 : Desktop, WebGUI

dbo 스키마를 사용하는 것은 마지막 밀레니엄입니다 :-)


그래서 이것을 빼앗아 새 테이블에 스키마를 붙이려면 코드를 업데이트해야합니다. 이것은 새로운 사용자가 보안 노드 아래에 나타나는 것이 일반적이라는 것을 의미합니까?
flipdoubt

@flipdoubt : 둘 다 그렇습니다. 일단 들어가서 스키마를 네임 스페이스 또는 컨테이너로 사용하면 이것이 제 2의 성격이됩니다
gbn

마지막 질문입니다. 사용자를 자동으로 추가하는 것이 일반적이고 개체를 만드는 동안 스키마를 지정하는 가장 좋은 방법 인 경우 자동으로 만들어진 사용자가 새 스키마에서 개체를 쿼리하는 동안 오류를 만들기 전에 어떻게 새 스키마에 권한을 부여 할 수 있습니까? 'DOMAIN \ User1'과 관련하여 게시 한 예를 사용하여 'DOMAIN \ AppUsers'계정에 액세스 권한을 할당 할 수 있지만 쿼리는 'DOMAIN \ User1'또는 'DOMAIN \ AppUsers'에 대한 액세스 권한을 사용합니까? 객체가 생성 되 자마자 서버가 사용자를 생성하는 것은 너무 교활합니다.
flipdoubt

권한은 스키마 소유자 (user1)로 기본 설정됩니다. 이것은 스키마에 대한 DB_OWNER와 같습니다
gbn

2

글쎄 @gbn 유형보다 나 빠릅니다.

내 유일한 제물 당신은 사용자가 응용 프로그램에 로그인되어 참조하고 ...입니다 그것은 테이블 등을 만들 수있는 사용자 수 있습니다. 응용 프로그램에서 허용하고 사용자가 SQL Server 자체를 통해이 작업을 수행하지 않는 경우 (SSMS를 사용하여 데이터베이스에 직접 로그인) 해당 응용 프로그램 공급 업체에 문의해야합니다.


우리는 앱을 작성했습니다.
flipdoubt

2

질문이 매우 오래되어 이미 승인 된 답변이 있지만 일반적인 조언을 제공하는 대신 질문에보다 구체적으로 답변하려고합니다.

  1. 이 동작은 "암시 적 스키마 및 사용자 생성"섹션의 https://docs.microsoft.com/en-us/sql/t-sql/statements/create-schema-transact-sql에 설명되어 있습니다 .

  2. 특정 스키마에서 오브젝트를 작성하려면 (문에서 스키마가 명시 적으로 지정되지 않은 경우) 사용자에 대해 DEFAULT_SCHEMA를 지정해야합니다. SQL Server 2008 R2 (및 이전 버전)에서는 Windows 그룹 기반 사용자에게 DEFAULT_SCHEMA를 할당하려고하면 오류가 발생하지만 SQL Server 2012 (및 이후 버전)에서는 이제 가능합니다.

  3. 해당 사용자에 대한 로그인이 없기 때문에 단순히 표시되지 않습니다. https://docs.microsoft.com/en-us/sql/t-sql/statements/create-user-transact-sql에 지정된대로 다른 그룹을 사용하거나 로그인하지 않은 사용자를 위해 사용자를 만들 수 있습니다. 모든 로그인.

  4. 작은 빨간색 화살표 (또는 최신 버전의 SSMS에서 작은 빨간색 x)는 데이터베이스에서 CONNECT 권한이없는 사용자를 나타냅니다 (그러나이 권한은 다른 그룹을 통해 얻을 수 있음).


0

이것은 오래된 질문이지만 SQL Server 2014 에서이 동작을 관찰하고 다음을 발견했습니다.

주어진 스크립트

USE [master]
CREATE DATABASE [Test]

USE [Test]

-- Note that we create the users without specifying the default schema
CREATE USER [MyDomain\MyADGroup] FOR LOGIN [MyDomain\MyADGroup] -- ad group
CREATE USER [MyDomain\MyDomainUser] FOR LOGIN [MyDomain\MyDomainUser] -- ad user (not in said AD group)

ALTER ROLE db_ddladmin ADD MEMBER [MyDomain\MyADGroup]
ALTER ROLE db_ddladmin ADD MEMBER [MyDomain\MyDomainUser]

EXECUTE AS LOGIN = 'MyDomain\MyAdGroupUser' -- a windows account which is a member of [MyDomain\MyADGroup]

CREATE TABLE Test
(
    a INT
)

REVERT 

EXECUTE AS USER = 'MyDomain\MyDomainUser'

CREATE TABLE Test
(
    a INT
)

이 스크립트는 Test라는 두 개의 테이블을 만듭니다.

첫 번째 CREATE TABLE는라는 테이블 [MyDomain\MyAdGroupUser].[Test]을 만들고 MyDomain\MyAdGroupUser스키마 ( MyDomain\MyAdGroupUser비활성화 된 데이터베이스 사용자 뿐만 아니라) 도 생성합니다.

두 번째 CREATE TABLE는라는 테이블을 만듭니다[dbo].[Test]

그 이유는 CREATE TABLE명령이 스키마를 명시 적으로 나타내지 않기 때문에 기본 스키마를 사용하기 때문입니다.

사용자를 만들 때 기본 스키마를 지정하지 않았으므로 SQL Server는 Windows 사용자의 기본 스키마를 dbo로 설정하지만 Windows 그룹 사용자에 대해 기본 스키마를 설정하지 않으므로 스키마 / 사용자가 생성됩니다.

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