رازهای لینکد سرور (Linked Server) در SQL Server: راهنمای گام به گام اتصال امن و بهینه به پایگاههای داده راه دور
لینکد سرور (Linked Server) در SQL Server ابزاری قدرتمند است که به شما امکان میدهد دستورات را روی منابع داده OLE DB در سرورهای دیگر اجرا کنید. این قابلیت به شما اجازه میدهد تا کوئریها، روالهای ذخیره شده (Stored Procedures) و دستورات را از یک نمونه (Instance) SQL Server واحد، بر روی نمونههای دیگر SQL Server، Oracle، MySQL، Access و سایر منابع داده اجرا کنید. لینکد سرور را میتوان پلی تصور کرد که SQL Server فعلی شما را به سایر منابع داده متصل میکند و دسترسی و یکپارچهسازی بیوقفه دادهها را فراهم میسازد.
کاربردهای لینکد سرور (Linked Server)
این قابلیت در سناریوهای مختلفی مفید واقع میشود:
- یکپارچهسازی دادهها: ترکیب دادهها از چندین منبع در یک کوئری واحد.
- گزارشگیری: ایجاد گزارشهایی که نیاز به دادههای جمعآوری شده از چندین سرور دارند.
- انتقال دادهها: انتقال دادهها بین سرورهای مختلف یا پایگاههای داده متفاوت.
- توزیع وظایف: اجرای روالهای ذخیره شده (Stored Procedures) بر روی سرورهای راه دور.
ایجاد یک لینکد سرور
شما میتوانید یک لینکد سرور را هم با استفاده از SQL Server Management Studio (SSMS) و هم با Transact-SQL (T-SQL) ایجاد کنید.
استفاده از SQL Server Management Studio (SSMS)
- در SQL Server Management Studio (SSMS)، بخش “Server Objects” و سپس “Linked Servers” را گسترش دهید.
- بر روی “Linked Servers” کلیک راست کرده و “New Linked Server…” را انتخاب کنید.
- در پنجره گفتگوی “New Linked Server”، تنظیمات زیر را پیکربندی کنید:
- Linked server: نامی برای لینکد سرور خود وارد کنید (مثلاً `MyRemoteSQLServer`).
- Server Type:
- SQL Server: برای اتصال به یک نمونه دیگر از SQL Server.
- Other data source: برای اتصال به سایر انواع منابع داده (مانند Oracle، MySQL، Access و غیره).
- Provider: ارائهدهنده OLE DB مناسب برای منبع داده خود را انتخاب کنید. برای SQL Server، اغلب میتوانید از ‘SQL Server Native Client’ استفاده کنید.
- Product name: یک نام توصیفی برای لینکد سرور وارد کنید (مثلاً ‘Oracle_Server’).
- Data source: نام یا آدرس شبکه سروری که میخواهید به آن متصل شوید.
- Catalog: نام کاتالوگ یا پایگاه داده پیشفرض (اختیاری).
- به تب “Security” بروید و نحوه احراز هویت لاگینهای محلی به سرور راه دور را پیکربندی کنید. میتوانید از لاگین فعلی کاربر استفاده کنید، یک لاگین خاص را نگاشت کنید یا همه لاگینها را با یک کاربر راه دور مشخص نگاشت کنید.
- بر روی “OK” کلیک کنید تا لینکد سرور ایجاد شود.
استفاده از Transact-SQL (T-SQL)
شما همچنین میتوانید یک لینکد سرور را با استفاده از Transact-SQL (T-SQL) ایجاد کنید.
برای ایجاد یک لینکد سرور به یک نمونه دیگر از SQL Server، میتوانید از دستور sp_addlinkedserver به صورت زیر استفاده کنید:
EXEC sp_addlinkedserver
@server = 'LINKEDSERVER_NAME',
@srvproduct = '',
@provider = 'SQLNCLI11',
@datasrc = 'REMOTE_SERVER_NAME';
در این دستور، 'LINKEDSERVER_NAME' نامی است که برای لینکد سرور خود انتخاب میکنید و 'REMOTE_SERVER_NAME' نام سرور یا آدرس IP سرور راه دور است.
برای اتصال به منابع داده غیر SQL Server مانند Oracle، میتوانید provider و datasrc مناسب را مشخص کنید. مثال زیر برای Oracle است:
EXEC sp_addlinkedserver
@server = 'ORACLE_LINKEDSERVER',
@srvproduct = 'Oracle',
@provider = 'MSDAORA',
@datasrc = 'ORACLE_TNS_NAME';
در اینجا، 'ORACLE_LINKEDSERVER' نام لینکد سرور شما و 'ORACLE_TNS_NAME' نام TNS برای پایگاه داده Oracle است.
اضافه کردن امنیت (Login Mapping)
پس از ایجاد لینکد سرور، اغلب نیاز است که برای امنیت، نگاشت لاگین (Login Mapping) را تنظیم کنید. این تنظیمات نحوه احراز هویت لاگینهای محلی به سرور راه دور را مشخص میکند.
برای نگاشت یک لاگین محلی به یک لاگین راه دور، از دستور sp_addlinkedsrvlogin استفاده کنید:
EXEC sp_addlinkedsrvlogin
@rmtsrvname = 'LINKEDSERVER_NAME',
@useself = 'FALSE',
@locallogin = 'CURRENT_LOGIN',
@rmtuser = 'REMOTE_USERNAME',
@rmtpassword = 'REMOTE_PASSWORD';
در این مثال، 'LINKEDSERVER_NAME' همان نامی است که به لینکد سرور خود دادهاید، 'CURRENT_LOGIN' لاگین SQL Server فعلی شماست که قصد دارید از طریق آن به سرور راه دور دسترسی پیدا کنید، و 'REMOTE_USERNAME' و 'REMOTE_PASSWORD' اطلاعات ورود به سرور راه دور هستند.
برای استفاده از محتوای امنیتی لاگین فعلی (احراز هویت ویندوز) برای لینکد سرور:
EXEC sp_addlinkedsrvlogin
@rmtsrvname = 'LINKEDSERVER_NAME',
@useself = 'TRUE';
این دستور به لینکد سرور اجازه میدهد تا از اعتبارنامههای کاربری ویندوز فعلی برای اتصال به سرور راه دور استفاده کند.
آزمایش یک لینکد سرور
پس از ایجاد لینکد سرور، توصیه میشود اتصال را آزمایش کنید.
برای آزمایش اتصال به لینکد سرور، میتوانید از دستور sp_testlinkedserver استفاده کنید:
EXEC sp_testlinkedserver 'LINKEDSERVER_NAME';
اگر اتصال موفقیتآمیز باشد، پیامی مانند 'The linked server "LINKEDSERVER_NAME" was successfully tested.' دریافت خواهید کرد.
کوئری زدن به لینکد سرور
سه روش اصلی برای اجرای کوئریها بر روی لینکد سرور وجود دارد:
۱. نام چهار قسمتی (Four-Part Name)
این روش، رایجترین و سادهترین راه است. شما اشیاء موجود در لینکد سرور را با استفاده از یک نام چهار قسمتی ارجاع میدهید:
LinkedServerName.DatabaseName.SchemaName.ObjectName
این ساختار شامل نام لینکد سرور، نام پایگاه داده، نام طرح (schema) و نام شیء (جدول، ویو یا روال ذخیره شده) است.
مثال:
SELECT *
FROM LINKEDSERVER_NAME.DatabaseName.dbo.TableName;
این کوئری تمام ستونها را از TableName در DatabaseName روی لینکد سرور به نام LINKEDSERVER_NAME بازیابی میکند.
۲. تابع OPENQUERY
تابع OPENQUERY به شما امکان میدهد یک کوئری (pass-through query) را مستقیماً بر روی لینکد سرور اجرا کنید. این روش اغلب برای کوئریهای پیچیده کارآمدتر است، زیرا بهینهساز (optimizer) لینکد سرور مسئول برنامه اجرایی کوئری خواهد بود.
OPENQUERY (linked_server, 'query')
در اینجا linked_server نام لینکد سرور شما و query کوئری SQL است که میخواهید بر روی آن سرور اجرا کنید.
مثال:
SELECT *
FROM OPENQUERY(LINKEDSERVER_NAME, 'SELECT * FROM DatabaseName.dbo.TableName');
این کوئری نیز تمام ستونها را از TableName در DatabaseName روی لینکد سرور بازیابی میکند، اما با استفاده از OPENQUERY.
۳. تابع OPENROWSET
تابع OPENROWSET شبیه به OPENQUERY است اما به شما امکان میدهد مستقیماً به یک منبع داده OLE DB متصل شوید، بدون اینکه نیازی به تعریف یک لینکد سرور از پیش داشته باشید. این تابع برای کوئریهای موقت (ad-hoc queries) یا اتصالات یکبار مصرف مفید است.
OPENROWSET ( 'provider_name', 'data_source', 'query' )
در این ساختار، provider_name نام ارائهدهنده OLE DB، data_source اطلاعات اتصال به سرور راه دور، و query کوئری SQL است.
مثال:
SELECT *
FROM OPENROWSET('SQLNCLI11', 'Server=REMOTE_SERVER_NAME;UID=RemoteUser;PWD=RemotePassword;', 'SELECT * FROM DatabaseName.dbo.TableName');
این کوئری به طور موقت به 'REMOTE_SERVER_NAME' متصل شده و دادهها را از TableName بازیابی میکند.
مدیریت لینکد سرورها
مشاهده لینکد سرورها
میتوانید تمام لینکد سرورهای پیکربندی شده را با کوئری زدن به نماهای سیستمی (System Views) مشاهده کنید.
این دستور لیست لینکد سرورهای فعال را نشان میدهد:
SELECT * FROM sys.servers WHERE is_linked = 1;
حذف یک لینکد سرور
برای حذف یک لینکد سرور، میتوانید از روال ذخیره شده sp_dropserver استفاده کنید.
این دستور لینکد سرور و نگاشت لاگینهای مرتبط با آن را حذف میکند:
EXEC sp_dropserver 'LINKEDSERVER_NAME', 'droplogins';
دقت کنید که جای 'LINKEDSERVER_NAME' نام لینکد سرور مورد نظر شما را قرار دهید.
امنیت لینکد سرور (Linked Server)
امنیت یکی از جنبههای حیاتی در پیکربندی لینکد سرورهاست. هنگام تنظیم لینکد سرورها، موارد زیر را در نظر داشته باشید:
- احراز هویت (Authentication): اطمینان حاصل کنید که روش احراز هویت مورد استفاده (احراز هویت ویندوز یا SQL Server) امن است و اعتبارنامهها به درستی مدیریت میشوند.
- اصل حداقل دسترسی (Least Privilege): تنها مجوزهای لازم را به لاگینهای لینکد سرور در سرور راه دور اعطا کنید. از اعطای مجوزهای بیش از حد خودداری کنید.
- رمزگذاری (Encryption): در صورت امکان، از اتصالات رمزگذاری شده برای محافظت از دادهها در حین انتقال استفاده کنید.
- بازرسیهای منظم (Regular Audits): پیکربندیها و مجوزهای لینکد سرور را به صورت دورهای بازبینی کنید تا از عدم وجود دسترسیهای غیرمجاز اطمینان حاصل شود.
نتیجهگیری
لینکد سرورها ابزاری قدرتمند برای یکپارچهسازی و دسترسی به دادهها در محیطهای توزیع شده SQL Server هستند. با درک صحیح نحوه ایجاد، کوئری زدن و مدیریت آنها، میتوانید از این قابلیت برای بهبود کارایی و انعطافپذیری سیستمهای پایگاه داده خود بهرهبرداری کنید. همیشه جنبههای امنیتی را در نظر داشته باشید تا از یکپارچگی و محرمانگی دادههایتان محافظت شود.