Linked Server ها(۲)

قسمت اول ،قسمت سوم  ، قسمت چهارم

Logical Server Names

ممکن است شما نیاز به بیش از یک link بر روی یک سرور داشته باشید که یک نتیجه بارز آن کاهش شدید امنیت سرور است.ممکن است نیاز داشته باشید یکسری از کاربران به DB خاص و سری دیگر به  DB  دیگری دسترسی داشته باشند و هر گروه مجوز دسترسی به DB  گروه دیگر را نداشته باشند.

Multiple links to the same target server
جهت دیدن عکس بزرگتر کلیک کنید.

کد زیر دو Logical Linked Server به یک ماشین (یکی برای دسترسی به Pubs بنام fuji_PBS_DB و در حالی که fuji_NORTHWIND_DB به NorthWind دسترسی می یابد. )میسازد

برای امتحان کد شما باید در سرور هدف(target) دو Login  بنامهای fuji_NORTHWIND و fuji_PUBS تنظیم کنید و مجوز دسترسی هر کدام برای DB  مربوط به خودشان را هم بدهید.

sp_addlinkedserver 
fuji_PBS_DB , 
droplogins @server='fuji_PUBS_DB',
@srvproduct='', 
@provider='SQLOLEDB',
@datasrc='FUJI'
 
go
 
sp_addlinkedsrvlogin 
@rmtsrvname = fuji_PUBS_DB, 
@useself = false,
@locallogin = NULL,
@rmtuser = fuji_PUBS , 
@rmtpassword = fuji_PUBS
 
go
sp_addlinkedserver       
fuji_PBS_DB, 
droplogins  @server='fuji_NORTHWIND_DB',
@srvproduct='',
@provider='SQLOLEDB',
@datasrc='FUJI'
 
go
 
sp_addlinkedsrvlogin 
@rmtsrvname = fuji_NORTHWIND_DB,
@useself = false,
@locallogin = NULL,
@rmtuser = fuji_NORTHWIND,
@rmtpassword = fuji_NORTHWIND
 
go
 
 حالا ما می توانیم مثال ساده خود را جهت نشان دادن تفاوت بین دو سرور اجرا کنیم:
select * from openquery (fuji_PUBS_DB, 'select @@serverName, user_name(), db_name(), @@spid')
 select * from openquery (fuji_NORTHWIND_DB, 'select @@serverName, user_name(), db_name(), @@spid')
یک نکته امنیتی 
اینکه چون ما 2 Login درست کرده و کاربران خود را از طریق آن دو به linked server متصل کرده ایم ، هر کاربری که به 
سرور محلی وصل شود قادر است به سرورremote هم وصل شود.  پس کافی است که کاربر بداند که امکان دسترسی به linked server  
را نیز دارد. آنچه مسلم است ابتدا باید کاربران گروهبندی شده و فقط آنها که نیاز به linked server دارند بتوانند به آن وصل شوند، که این 
هم راه حل مطلوب نیست و حتی الامکان سعی شود که برای هر کاربر login مختص به خود او روی linked server ایجاد گردد.
 
 

نکته امنیتی دیگر

بر طبق اصول در حالی که امنیت کافی برای سرورتان برقرار نکرده اید، آن را برای استفاده دیگران باز نگذارید. امکان کار کردن مستقیم کاربر

با سرور را ندهید، بسته های مورد نیاز کاربر را در غالب procedureها ، Functionها و یا کدهای سمت سرویس گیرنده تهیه کنید و به وی

مجوز کار با آنها را بدهید و کارش را کنترل کنید.کابران تنها به داده های خود را نیاز دارند، آنها کاری ندارند که داده ها چگونه می آیند.

استفاده از linked server
بعد از این تنظیمات ما چه کاری با آنها می توانیم انجام دهیم؟اجازه دهید به مثالهایی نگاه بیاندازیم:
مدل ابتدایی دسترسی به داده های  remote را پیشتر دیدیم:
 
Select * from openquery (server, 'your query here') --basic syntax
 

این دستور موجب می شود که SQL Server یک ارتباط با سرور هدف  ایجاد کند؛ به آن Login کند؛ query مورد نظر شما را اجرا کند؛

داده ها را به سروری که شما با آن کار می کنید برگرداند و در آخر ارتباط را قطع کند.

 

این query دقیقا همان عمل را انجام می دهد اما به شکل شسته و رفته و بسیار آسانتر جهت استفاده:

 
select * from fuji_PUBS_DB.pubs.dbo.authors
 
با این ترکیب ساده براحتی می توانیم joinهایی بر روی سرورهای مختلف داشته باشیم. مثلا در حالی که تغییراتی در نام نویسندگان در 
جدول authors از بانکPubs ، در remote server اعمال کرده ایم ، با query ساده زیر می توانیم از ردیفهای تغییر یافته مطلع شویم:
 
select r.au_fname as remote_fname,  r.au_lname as remote_lname,  l.*
from authors l  fuji_PUBS_DB.pubs.dbo.authors r
on    l.au_id = r.au_id
where l.au_fname <> r.au_fname OR l.au_lname <> r.au_lname
 
 
 
...ادامه دارد