테이블 스키마를 지정하지 않고 쿼리


10

SQL Server 2000에서 2008 데이터베이스로 많은 테이블을 가져 왔습니다. 가져온 모든 테이블에는 내 사용자 이름이 접두사로 붙습니다 (예 :) erpadmin.tablename.

테이블 특성에서 'erpadmin'이 db 스키마로 나열됩니다. 쿼리를 작성할 때 'erpadmin'을 포함시켜야합니다. 혼동되는 모든 테이블 이름 앞에.

현재 결과 :

select *
from erpadmin.tablename

원하는 결과 :

select *
from  tablename

답변:


23

SQL Server 2000에서와 같이 dbo 스키마 사용으로 돌아가려면 테이블을 dbo 스키마로 다시 이동할 수 있습니다.

ALTER SCHEMA dbo TRANSFER erpadmin.tablename;

dbo 이외의 스키마를 사용하려는 경우 다른 방법으로 사용자의 기본 스키마를 설정 erpadmin한 다음 스키마를 지정하지 않으면이를 기본값으로 사용합니다. sysadmin 고정 서버 역할의 멤버는 기본적으로 무시 DEFAULT_SCHEMA하고 사용 dbo합니다.

ALTER USER erpadmin WITH DEFAULT_SCHEMA = erpadmin;

두 부분 이름 (schema.table)은 좋은 습관이므로 참조하는 테이블을 명시 적으로 지정할 수 있습니다. 일부 기능을 사용하려면 두 부분으로 된 이름을 사용해야하며 인덱싱 된 뷰가 한 예입니다.


17

데이터베이스 오브젝트에 액세스 할 때 스키마 이름을 지정해야하는 이유는 일반적인 경우입니다 . 지정되지 않고 기본 스키마가 아닌 스키마의 객체에 액세스하려고하면 현재보고있는 문제가 발생합니다.

실제 해결 방법은 응용 프로그램 (또는 현재 문제를 일으키는 쿼리 에이전트)을 명시 적으로 변경하는 것입니다.

쿼리를 작성할 때 'erpadmin'을 포함시켜야합니다. 혼동되는 모든 테이블 이름 앞에.

혼동되지 않습니다. 그것은 명백한 명명 규칙 입니다. 객체 셔플 링과 불일치를 피하기 위해 해당 명명법을 따르는 것이 좋습니다.


3
항상 두 부분으로 된 이름을 사용하는 또 다른 이유는 여러 사용자가 동일한 코드를 실행하는 상황 (예 :)을 피하고 select ... from table5 ;다른 결과를 얻는 것입니다. 이는 계획 캐싱과 문제 해결에 좋지 않습니다 (큐 지원 담당자, "해당 쿼리는 여기에서 잘 실행됩니다"). 또한 함수 및 뷰의 색인 작성에 필요한 스키마 바인딩에는 두 개의 파트 이름이 필요합니다. TLDR : 게으른 중지-두 개의 부품 이름을 사용하십시오.
그린 스톤 워커

7

@AdamWenger 답변 외에도. 양극 스키마로 전송할 스크립트를 만들려면 다음 스크립트를 사용할 수 있습니다

select 'ALTER SCHEMA dbo TRANSFER '+s.name+'.'+t.name
from sys.schemas s
     join sys.tables t on t.schema_id=s.schema_id
where s.name='erpadmin'

4

마이그레이션이 완료된 방식으로 인해 문제가 발생했을 수 있습니다. 소유자로 간주되지 않는 한 사용자에게 물건을 첨부해서는 안됩니다.

스키마는 의미에 따라 테이블을 분리하는 데 도움이됩니다. HR 부서에 대한 하나의 자원 테이블이 있고 프로덕션 부서에 대해 별도의 테이블을 원하면서 둘 다 동일한 데이터베이스에 유지한다고 가정하십시오. 이 경우 생산 스키마와 HR 스키마에 각각 이름이 resource 인 두 개의 테이블이있을 수 있습니다. 따라서 기본 스키마로 항목을 가져 오지 않는 한 shcema를 지정해야합니다.

다른 이유로 마이그레이션을 다시 실행하지 않는 경우 Adam Wenger의 전송은 현명한 옵션이어야합니다.


-2

로 명령을 시작 USE [tablename] 참조 당신이보고있는 데이터베이스에 연결된 데이터베이스를 가지고 있지 않습니다 쿼리하면 아마 말한다 쿼리 창 상단에서 로그인 한 사용자에 대한 기본 아니다 "마스터"


3
당신은 [database_name]그렇습니까?
dezso 2012 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.