2017-09-12 1 views
0

많은 저장 프로 시저, 함수, 뷰 및 테이블이있는 프로젝트가 있습니다.T-SQL : 한정하지 않고 동일한 스키마의 DB 개체에 액세스 하시겠습니까?

나는 현재 모두 같은 스키마 내에서 데이터베이스 내에 배포 프로젝트를 가지고있다. 이 예제에서는 "mainproject"라고 부릅니다.

이제 동일한 데이터베이스에 이라는 중복 프로젝트를 생성해야합니다.. 분명한 해결책은 모든 개체를 다른 스키마로 복제하는 것입니다. 일부 SQL 스크립트를 사용하여이 작업을 수행 할 수있었습니다. 이제 첫 번째 스키마의 모든 개체를 포함하는 "secondproject"라는 다른 스키마가 있습니다.

문제는, 내 기능, 뷰 및 절차 모두에서, 원래의 스키마가 참조되고, 예를 들어, DECLARE @someVar INT = mainproject.getId(@someObject), SELECT someColumn FROM mainproject.someTable, UPDATE mainproject.someTable SET someColumn = @someValue WHERE someOtherColumn = @someOtherValue 그래서 함수를 실행하면 잘못된 스키마를 참조하게됩니다.

스키마 mainproject의 모든 발생을 찾아서 바꾸기 위해 수백 개의 뷰, procs 및 함수를 수행하는 것은 지루하고 잠재적으로 신뢰할 수없는 프로세스입니다.

내 질문은 어떤 객체를 참조 할 때 "현재 스키마 내에서"를 지정하는 방법은 무엇입니까?

그냥 'getId' is not a recognized built-in function name.DECLARE @someVar INT = getId(@someObject) 결과를하고 난 절차를 저장할 수 없습니다.


편집 : 아래의 첫 번째 답변은 상황을 조금 밝히는 데 도움이됩니다. 오브젝트에 액세스 할 때 스키마를 지정하지 않으면 기본 스키마에 있다고 가정합니다.

문제는 프로덕션 서버에있는에 내 DDL 스크립트를 실행하는 것입니다, 내 사용자 계정에 대한 서버의 기본 스키마는 dbo입니다. 응용 프로그램 사용자는 DML 문에만 액세스 할 수 있으므로 해당 계정을 사용하여 작성 스크립트를 실행할 수 없습니다.

내가 자격이 객체가 상주하는 동일한 스키마에있는 저장 프로 시저를 할 수있는 방법이없는 경우에 맡기 가정, 나는

답변

0

에서 .... 스크립트를 생성 한 후 찾기/바꾸기에 의존해야 SQL Server, 당신은 스키마에 대해 이야기하고 있습니다. 아무 것도 지정하지 않으면 데이터베이스 엔진은 현재 사용자의 기본 스키마가 기본값이됩니다. 기본적으로 dbo입니다. 즉, 서로 다른 스키마에 같은 이름의 객체가있는 경우 쿼리에 사용할 스키마를 지정해야합니다.

+0

예, 당신은 내가 스키마를 참조하고, 맞아요. 당신이 옳은 것처럼 보입니다. 문제는 "my"계정의 서버에서 개발 중입니다.이 계정은 기본 스키마가'dbo'로 설정되어 있습니다. 데이터베이스에 기본 스키마 세트로 개발할 다른 사용자 계정을 만들려고합니다. – fdmillion

+0

좋아, 내가 발견 한 문제는 로컬 인스턴스에 대해서는 정상적으로 작동하지만 프로덕션 서버에는 적합하지 않다는 것입니다. 나는 하나의 사용자 계정을 거기서 만 얻고, 단일 데이터베이스의 기본 스키마는'dbo'로 설정됩니다. 관리자가 만든 응용 프로그램 사용자에게는 DML 문 액세스 만 있으므로 DDL 쿼리를 실행하여 데이터베이스를 만들 수는 없습니다. SQL Server는 존재하지 않는다고 생각되는 객체를 참조하는 저장 프로 시저를 만들 수 없기 때문에 여전히 난장판입니다 ... – fdmillion

+0

동적 인 부분이 스키마 인 동적 SQL을 모두 만들 수 있다고 가정합니다. . 스키마를 찾고 교체 한 것보다 더 많은 노력과 혼란이있을 것이라고 생각합니다. 여러 로그인을 할 수 없으면 매우 어려워집니다. –

관련 문제