Nun, da ich eine Minute hatte, was ich in meinem Kommentar sagte, ist, dass Sie nur einen Teil eines Objekts Pfad ein Synonym nicht schaffen können, wie Sie es wünschen. Aber Sie können das Löschen und Erstellen von Synonymen für jedes Objekt in Ihrer entfernten Datenbank sehr einfach skripten. Hier finden Sie ein Beispiel für die Vorgehensweise für Benutzertabellen. Für andere Objekte können Sie die sys.objects anstelle der Systemsicht sys.table verwenden.
Technik Schlüsselwörter für mehr lernen. Dynamisches SQL, Cursor, Schemaansichten.
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
Machen Sie einfach bessere Namen für Ihre verbundenen Server. Der Name des LinkedServer muss * nicht * mit dem tatsächlichen Servernamen übereinstimmen. – RBarryYoung
Nein, aber Sie können die Erstellung von Synonymen für Objekte in Ihrer Datenbank auf Ihrem Verbindungsserver leicht skripten. benutze einfach [servername]. [dbname] .sys.objects und dynamische sql dazu – Matt
@Matt, kannst du bitte klarstellen, was du meinst? – Eliezer