আমি কীভাবে পোর্টেবল এসকিউএল লিখব যা কোনও লিঙ্কযুক্ত সার্ভারকে বোঝায়?


9

আমি একটি সঞ্চিত পদ্ধতি পেয়েছি যা কোনও লিঙ্কযুক্ত সার্ভারকে বোঝায়। প্রক্রিয়া জুড়ে বেশ কয়েকটি জায়গায় আমি নীচের মতো কিছু পেয়েছি:

INSERT INTO [TableName]
(...Columns...)
SELECT ...Columns...
FROM [ServerName\InstanceName].[Catalogue].[dbo].[TableName]
WHERE TableNameID = @TableNameID

এই পদ্ধতিটি আমার বিকাশের পরিবেশ, পরীক্ষার পরিবেশ এবং লাইভ পরিবেশে বিদ্যমান।

সমস্যাটি হ'ল প্রক্রিয়াটির প্রতিটি অনুলিপি যথাযথভাবে পৃথক হয় কারণ প্রতিটি পরিবেশের জন্য সার্ভারের নামগুলি আলাদা। এটি স্ক্রিপ্ট আপডেটগুলি মোতায়েনের ব্যবস্থাপনাকে জটিল করে তোলে।

পদ্ধতিটি পোর্টেবল করার কোনও উপায় আছে যাতে প্রতিটি পরিবেশ এটির অভিন্ন সংস্করণ চালাতে পারে?

যদি তা না হয় তবে স্ক্রিপ্ট মোতায়েনের ভুল / ত্রুটির প্রবণতা কম করার জন্য আমি কী করতে পারি?


3
প্রতিটি সার্ভারে পৃথক পৃথক দৃষ্টিভঙ্গি তৈরি করা কি একটি বিকল্প? আপনি মতটিকে সংজ্ঞায়িত করতে SELECT <fields> FROM <linked server>পারেন তবে কোডটি বজায় রাখতে সমস্ত সার্ভারে একই ভিউ নামটি ব্যবহার করতে পারেন
JNK

@ জেএনকে এটি কোনও খারাপ ধারণা নয়, যদিও বেশ কয়েকটি টেবিল রয়েছে তবে লিঙ্কযুক্ত সার্ভারের রেফারেন্সগুলি জুড়ে মজাদার পদ্ধতির তুলনায় কমপক্ষে মতামতগুলি বজায় রাখা সহজ হবে।
ডক্টর জোনস

@ জেএনকে, আপনার উত্তর দেওয়া উচিত।
এইচএলজিইএম

উত্তর:


14

আপনার লিঙ্কযুক্ত সার্ভারের নামটি সার্ভারের নাম হতে হবে না। আপনি একটি জেনেরিক নাম ব্যবহার করতে পারেন।

EXEC master.dbo.sp_addlinkedserver
    @server = N'COMMONNAME',
    @srvproduct=N'MSDASQL',
    @provider=N'SQLNCLI',
    @provstr=N'DRIVER={SQL Server};SERVER=ACTUALSERVERNAME;UID=user1;PWD=rosebud567;', 
    @catalog=N'database1'

একই পরিবেশে প্রতিটি পরিবেশে লিঙ্কযুক্ত সার্ভার সেট আপ করুন, তবে বাস্তবে এগুলিকে বিভিন্ন সার্ভারে চিহ্নিত করুন।


0

আমি জেনেরিক লিঙ্কযুক্ত সার্ভারের নামটি ব্যবহার করার ধারণাটি পছন্দ করি। তবে, অনেক পরিবেশে এটি সম্ভব নাও হতে পারে, এই ক্ষেত্রে, আপনি আপনার এসপিতে গতিশীল এসকিউএল ব্যবহার করতে পারেন।

declare @linkedservername nvarchar(200)
declare @sql nvarchar(4000)
SET @linkedservername =  CASE @@ServerName  
                            WHEN 'DevServer' THEN 'LinkedServerForDevEnvironment'
                            WHEN 'TestServer' THEN 'LinkedServerForTestEnvironment'
                            WHEN 'ProdServer' THEN 'LinkedServerForProdEnvironment'
                            ELSE Null
                        END   

set @sql = 'INSERT INTO [TableName] 
(...Columns...) 
SELECT ...Columns... 
FROM ' + @linkedservername + '.[Catalogue].[dbo].[TableName] 
WHERE TableNameID = @TableNameID'

Exec  @sql

1
আমি নোট করব যে আমি যদি বাস্তব জীবনে এটি করছিলাম তবে আমি চেষ্টা করব ব্লকটি ব্যবহার করে একটি ত্রুটি বাধিয়ে দেব যদি @ লিঙ্কডসার্ননেম সেটটি বিবৃতিটি বাতিল করে দেয় তবে আপনাকে সতর্ক করতে হবে যে এটি ভুল সার্ভারে চালিত হয়েছে।
এইচএলজিইএম

1
আপনি যদি এই পদ্ধতির অবলম্বন করেন তবে আমি মনে করি যে আমি কোনও ফাংশনে সিএসই-র বিবৃতিটি গুটিয়ে রাখি তাই যদি কোনও সার্ভার পরিবর্তিত হয় তবে আমাকে কেবল ফাংশনটি আপডেট করতে হবে।
এলি

ভাল পয়েন্ট @ এলি
এইচএলজিইএম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.