SYNONYM 설정시 현재 (2016) 까지는
데이터베이스.스키마.개체명 까지 다 넣어야,,, 동의어로 지정할수있다
(테이블명 까지 지정해줘야함 )
TestDb 데이터베이스에 TestSchema 에 TestTable // FQN 접근시
→ select * from TestDb.TestSchema.TestTable
create SYNONYM 동의어명 For 데이터베이서.스키마.테이블명
Create SYNONYM SN_Test For TestDb.TestSchema.TestTable
→ select * from SN_Test
* 기술적으로 복잡함이 없어 FAQ로 구성해 보았다.
-------------------------------------------------------------------------------------------------------------------------
Q) 시놈님 생성은?
(위에) create SYNONYM 동의어명 For 데이터베이서.스키마.테이블명
Q) 시놈님 생성시 dB명만 해도 되나요?
Create SYNONYM SN_Test For TestDb 만들어짐!! 오케이 된다!
select * from SN_Test.스키마명.테이블명 -> 오류!! 안됨!!
만들어는 지나, 접근이 안됨,,
결론은 안됨!!!!!
Q) 그럼 dB명.스키마 까지... 해도 되나요?
이거? Create SYNONYM SN_Test For TestDb .TestSchema
select * from SN_Test.테이블명 오류!! 안됨!!
만들어는 지나 접근이 안됨
결론은 안됨!!!!!
Q) 시놈님 삭제는 ?
drop SYNONYM 동의어명;
Q) 시놈님 수정은?
수정은없음 drop & Create
Q) 시놈님과 연동 동의어의 개체가 사라지면?
따로 drop 해줘야함 - 관리필요 (drop SYNONYM 동의어명)
Q) 테이블 새로 만들어지면 시놈님 자동생성안되나요 ?
안됨, 따로 create 해줘야함 - 관리필요
Q) create 시놈님 안에 연결 개체를 바꿀려면(수정)?
drop 하고 create 하삼 alter 없음
Q) 테이블 100개면 시놈님 연결하러면요?
create SYNONYM 100번해야함 해야함
Q) 프로시져도되요?
프로시져는 개체 , 당연됨 함수도됨 그냥 똑같음
Create SYNONYM 동의어명 For sp_memberUtil
-> exec 동의어명
Q) 프로시저 시놈님만들었는데? 파라미터는 어떻게해야되나요?
-> exec 동의어명 'C' , 'UserID' -- 기존 프로시져와 똑같이 하면됨
-> 기존 프로지서 exec sp_memberUtil 'C' , 'UserID'
Q) 테이블 2000개 프로시져 1만개... 모두 만들려고합니다...
쉽게 만들수있는방법은 ?
-- 참고 ---------------------------------
select * from sys.tables
select * from sys.synonyms
아래와같이 동적으로 생성이 가능하다. :)
declare @var nvarchar(100)
set @var = 'create synonym ' + 시놈님명 + ' for ' + 객체명
EXEC SP_EXECUTESQL @var -- EXEC(@var) 로 해도됨
또는, 변수로 처리
declare @var nvarchar(1000)
declare @tbl nvarchar(20)
declare @syName nvarchar(20)
set @syName = 'sy_t'
set @tbl = 'partitionDb.dbo.tbl'
set @var = 'create synonym ' + @syName + ' for ' + @tbl
EXEC SP_EXECUTESQL -- 또는, EXEC (@var)
단, 아래와 같이 sp_executesql 생성시 파라미터로 전달은 안된다.
set @syName = 'sy_t'
set @tbl = 'tbl'
-- 파라미터로 객체명 전달시 오류 발생
set @var = 'create synonym @syName for @tbl'
EXEC SP_EXECUTESQL @var , N'@syName varchar(20) , @tbl varchar(20)' , @syName , @tbl
Q) 전 마우스로 밖에못하는데 어디서 만들어요?
당황하지말고 SSMS 에 DB [+] 클릭 Table 있고 View 있고 그아래쯤 SYNONYM
거기서 우클릭해서 해보길.
------- 2018-01-29 추가 ----------------------------------------------------------------------------------------------------
Q) 시놈님과 연결한 [A] 테이블을 drop 후 같은이름으로 테이블[A] 다시 만들었는데 어떻게 되나요?
시놈님도 다시 만들어야하나요?
결론 부터 말하면 기존에 [A] 테이블과의 연동이 끊기고 새로만든 [A] 테이블과 자동연동된다.
이는 시놈님 구조가 테이블의 object_id 가 아닌 테이블명과 연결되기때문,
-- 시놈님의 시스템 테이블
select * from sys.synonyms -- base_object_name 이 실제 연동된 테이블
① 위의 sys.synonyms 테이블을 select 해보시면 base_object_name 에 연결된 테이블 명칭이있습니다.
② 시놈님의 동의어 만들때 개체의 object_id를 이용하지 않습니다. (이름(테이블명) 사용함)
③ 결론은 다시 만들어진 테이블 A 와 시놈님의 자동으로 연동 됩니다.(이유는 ②번과 같습니다.)
* 시나리오
1년전 특정 로깅을 위해 Table_X 테이블을 만들었고 Table_X 동의어로 synonym "SY_X"를 설정하여,,,
프로시저 및 접근시 SY_X 로 모두처리하였습니다. 5년후 많이 쓰지않는 테이블 이고, 정책에 반하는 테이블이라, drop 시키고, 새로운 기획에 의해 Table_X 를 다시 만듬 SY_X 는 그대로 유효한가?
위에서 이야기한대로 object id 가 아닌 테이블명 으로 연동되어 그대로 이용가능하나, 새로만든 테이블의
구조가 기존과 다르다면, SY_X로 박혀있는 프로시져 기타 소스들은확인 & 수정 할 필요가 있다.