2017-11-14 3 views
0

각 세션에 대해 별도의 테이블에 특정 세션 데이터를 보유하고있는 데이터베이스에서 작업하고 있습니다. 예 : ProductsABCD라는 테이블이 있는데,이 테이블은 ABCD가 세션 ID 인 세션에서 볼 수있는 제품을 보관합니다. 우아하지 않지만, 내가 함께해야 할 일.Microsoft SQL Server 세션 특정 동의어 만들기

DECLARE @Session AS VARCHAR(MAX) = 'ABCD' 
DECLARE @strSQL AS VARCHAR(MAX) 

SET @strSQL = 'SELECT * FROM Products' + @Session 
EXEC (@strSQL) 

매우 단순화 된 버전을하지만, 지금까지 동적 SQL을 사용하고있다 사람이 아주 추악하게 얼마나 빨리 당신을 말할 것이다 : 현재 나는 형식이 데이터에 액세스합니다. 나는 현재 동의어를 사용하는 옵션을 찾고있다. 나는 이것을 Dynamic SQL에서 설정 한 다음 동적이 아닌 동의어에 액세스 할 수 있습니다. 예 :

DECLARE @Session AS VARCHAR(MAX) = 'ABCD' 
DECLARE @strSQL AS VARCHAR(MAX) 

SET @strSQL = 'CREATE SYNONYM myProducts FOR Products' + @Session 
EXEC (@strSQL) 

SELECT * 
FROM myProducts 

DROP SYNONYM myProducts 

동의어가 전 세계적으로 액세스 가능한 여러 사용자가 온라인 상태 일 때 단일 사용자가 자신이 아닌 실행 가능한 옵션 테스트 때이 작동하는 동안. 누구나 한 번에 하나의 세션에서만 액세스 할 수있는 동의어를 만드는 방법을 알고 있습니까? 임시 테이블을 단일 세션에서만 액세스하는 방법과 비슷합니다.

감사합니다.

추가 정보를 원하시면 여기

정황이 제품은 눈에 보이는 무엇인지, 가격이 표시됩니다 무엇을, 어떤 재고 수준 등을 액세스 할 수있는 이들 각각은 글로벌에 저장되어 정의 여기 놀이에 일부 비즈니스 로직이 있음 있습니다 세션이 시작될 때 생성 된 테이블은 세션 삭제 또는 타이머에서 정리됩니다.

설정 저장 프로 시저가 끝나면 수명이 만료되므로 임시 테이블에 저장할 수 없습니다. 시스템에서 사용할 수있는 데이터의 세션 수/qty가 높기 때문에 필드로 세션 매개 변수가있는 단일 테이블에 보관할 수 없습니다. 이것은 파티셔닝이 실제로 옵션이되기 전에 개발되었습니다. 저장 프로 시저를 대대적으로 다시 작성해야 할 것입니다. 상속 된 기존 시스템이라는 것을 기억하십시오.

여기서 db 세션은 데이터베이스에 대한 단일 연결을 열고 해당 세션을 열어 두는 IIS 세션입니다. 그런 다음 로그 아웃 할 때 보내지는 처분 세션이나 적절하게 처리되지 않은 이전 세션을 지우는 타이머를 통해 지워집니다.

나는 연결 기간 동안 또는 저장 프로 시저에 대한 특정 호출 중에 만 고유 한 동의어를 찾고있을 것입니다. 다른 세션이나 저장 프로 시저에서 동의어를 사용할 수없는 경우 작동합니다.

+0

꽤 어림짐작과 해결책의 개념. 여기에 "세션"이란 무엇입니까? 왜 세션에 자체의 글로벌 영구 객체가 있습니까? 세션 인터럽트 또는 누군가가 한 번에 많은 세션을 시작하면 어떻게 될까요? –

+0

@IvanStarostin 주요 질문에 세부 사항을 추가했습니다. 내가 일하고있는 패키지는 예의가있는 "독특한"패키지입니다! –

+0

다른 세션이 동일한 로그인 (db principal)에서 실행됩니까? –

답변

1

이 퀘스트를 피할 수있는 방법은 세션 당 사용자를 만들고, 세션 별 스키마에 모든 테이블을 넣고,이 스키마를이 사용자로 설정하고, 테이블 앞에 스키마를 지정하지 않고 execute as <session-user>으로 모든 것을 실행하는 것입니다. 테이블을 같은 이름으로 유지할 수 있습니다 (그러나 다른 스키마에 있음). 이 경우에는 dbo 스키마에 더 이상 존재하지 않는 것이 좋습니다. 언젠가는 모든 해결책을 다시 생각해보십시오.

+0

나는이 아이디어가 마음에 들지만 현재의 임플란트와 함께 작동하는지 확신 할 수 없다.하지만 그것은 접근 자체가 아닌 데이터베이스 외부의 항목 때문이다. 나는 그것을 시도하고 그것을가는 방법을 볼거야. –

+0

이 문제를 조사하고 문제를 발견했습니다. 프로 시저 내에서 select가 호출되면 위치의 우선 순위는 sys 스키마, 프로 시저 기본 스키마, 데이터베이스 기본 스키마입니다. 사용자 기본 스키마는 고려되지 않습니다. Users 스키마는 동적 SQL을 사용하고 Dynamic에서 벗어나면 프로젝트의이 부분에 대한 전체 이유입니다. 이 주변의 어떤 방법 으로든 크게 감사하겠습니다. –