제2의 비엔지니어 인생관을 꿈꾸며

Posted
Filed under MSSQL

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로 박혀있는 프로시져 기타 소스들은확인 & 수정 할 필요가 있다.





 
  
 
 
    
  





2018/01/18 15:52 2018/01/18 15:52