당신이 원하는대로 당신이 개체 경로의 한 부분에 대한 동의어를 생성 할 수 있다는 것입니다. 그러나 원격 데이터베이스의 모든 객체에 대한 동의어 삭제 및 생성을 동적으로 스크립팅 할 수 있습니다. 다음은 사용자 테이블의 경우 수행하는 방법의 예입니다. 다른 개체의 경우 sys.table 시스템보기 대신 sys.objects를 사용할 수 있습니다.
더 많은 학습을위한 핵심어입니다. 동적 SQL, 커서, 스키마 뷰.
DECLARE @ServerAndDB SYSNAME = '[10.150.10.109].[lhf]'
DECLARE @SynonymSchema SYSNAME = '[syn]'
DECLARE @ObjectPath NVARCHAR(1000)
DECLARE @SynonymName NVARCHAR(1000)
DECLARE CursorName CURSOR FOR
SELECT
@ServerAndDB + QUOTENAME(SCHEMA_NAME(t.schema_id)) + '.' + QUOTENAME(t.name) as ObjectPath
,@SynonymSchema + '.' + QUOTENAME(t.name) as SynonymName
FROM
[10.150.10.109].[lhf].sys.tables t
WHERE
t.type = 'U'
OPEN CursorName
FETCH NEXT FROM CursorName
INTO @ObjectPath, @SynonymName
WHILE @@FETCH_STATUS = 0
BEGIN
BEGIN TRY
DECLARE @SQL NVARCHAR(MAX)
IF EXISTS (SELECT * FROM sys.synonyms WHERE object_id = OBJECT_ID(@SynonymName))
BEGIN
SET @SQL = 'DROP SYNONYM ' + @SynonymName
EXECUTE sp_executesql @SQLString
SET @SQL = ''
END
SET @SQL = 'CREATE SYNONYM ' + @SynonymName + ' FOR ' + @ObjectPath
EXECUTE sp_executesql @SQLString
SET @SQL = ''
END TRY
BEGIN CATCH
--Can do error handling here
END CATCH
FETCH NEXT FROM CursorName
INTO @ObjectPath, @SynonymName
END
CLOSE CursorName
DEALLOCATE CursorName
연결된 서버에 더 좋은 이름을 지정하십시오. LinkedServer 이름은 실제 서버 이름과 일치하지 않습니다. – RBarryYoung
아니 겠지만 링크 된 서버에서 데이터베이스의 개체에 대한 동의어 만들기를 쉽게 스크립팅 할 수 있습니다. [servername]. [dbname] .sys.objects와 동적 SQL을 사용하십시오. – Matt
@Matt, 당신이 의미 한 바를 명확히 해 주시겠습니까? – Eliezer