Recent Posts

Archives

Categories

Meta

Szinonima hivatkozások cseréje

Gyakran használjuk a szinonimákat arra, hogy egy másik adatbázis objektumaira úgy hivatkozhassunk, mintha sajátunk volna. Pl:

CREATE SYNONYM dbo.TAG FOR [DB].[dbo].[TAG];

Így a programban vagy az adatbázisunk többi objektumaiban csak a TAG-re hivatkozhatunk.  Viszont, ha le kell cserélni az összes hivatkozást mondjuk a DB2 adatbázisra, akkor arra a következő script tud segíteni:

-- SIS_HRINTERFACE és az SWORK2SIS szinonimák hivatkozásainak cseréje a SIS_DB-re
SET NOCOUNT ON

declare @prn int
set @prn = 1
declare @origdb sysname = 'DB_DEV' -- miről
declare @refdb sysname = 'DB' -- mire


SELECT name,base_object_name INTO #synonyms from sys.synonyms
where base_object_name not like '%'+db_name()+'%' and len(replace(base_object_name,'.','')) = len(base_object_name)-2

DECLARE @name nvarchar(80)
DECLARE @oname nvarchar(80)
DECLARE @sql  nvarchar(max)
DECLARE cur_syn CURSOR FOR
SELECT name,base_object_name FROM #synonyms

OPEN cur_syn
FETCH  cur_syn INTO @name,@oname
WHILE (@@FETCH_STATUS = 0) -- loop all synonyms
BEGIN
 set @sql = 'DROP SYNONYM dbo.' + @name + ';'
 if @prn = 1
 print @sql
 else
 EXEC (@sql)
 set @sql = 'CREATE SYNONYM dbo.' + @name + ' FOR ' + REPLACE(@oname,@origdb,@refdb) + ';'
 if @prn = 1
 print @sql
 else
 EXEC (@sql)
 FETCH  cur_syn INTO @name,@oname
END
CLOSE cur_syn
DEALLOCATE cur_syn

DROP TABLE #synonyms

A saját db-re hivatkozást azt a where kiszűri.