পুরো ডাটাবেসে GETDATE () এর ব্যবহার পরিবর্তন করা হচ্ছে


27

আমাকে একটি অ্যাজুরি এসকিউএল ডাটাবেসে একটি অন-প্রাঙ্গনে এসকিউএল সার্ভার 2017 ডাটাবেস স্থানান্তরিত করতে হবে এবং আমি বেশ কয়েকটি চ্যালেঞ্জের মুখোমুখি হচ্ছি যেহেতু বেশ কিছুটা সীমাবদ্ধতা অতিক্রম করতে হবে।

বিশেষত, যেহেতু একটি অ্যাজুরি এসকিউএল ডাটাবেস কেবল ইউটিসি সময়ে (সময় অঞ্চল নেই) কাজ করে এবং আমাদের স্থানীয় সময় প্রয়োজন তাই আমাদের ডাটাবেসের যে কোনও GETDATE() জায়গায় ব্যবহারের পরিবর্তন করতে হবে , যা আমার প্রত্যাশার চেয়ে বেশি কাজ প্রমাণিত হয়েছে।

স্থানীয় সময় পাওয়ার জন্য আমি একটি ব্যবহারকারী সংজ্ঞায়িত ফাংশন তৈরি করেছি যা আমার সময় অঞ্চলের জন্য সঠিকভাবে কাজ করে:

CREATE FUNCTION [dbo].[getlocaldate]()
RETURNS datetime
AS
BEGIN
    DECLARE @D datetimeoffset;
    SET @D = CONVERT(datetimeoffset, SYSDATETIMEOFFSET()) AT TIME ZONE 'Pacific SA Standard Time';
    RETURN(CONVERT(datetime,@D));
END

আমি যে সমস্যাটি নিয়ে সমস্যায় পড়ছি তা হ'ল GETDATE()প্রতিটি ভিউ, সঞ্চিত পদ্ধতি, গণিত কলাম, ডিফল্ট মান, অন্যান্য সীমাবদ্ধতা ইত্যাদিতে এই ফাংশনটি দিয়ে পরিবর্তন করা actually

এই পরিবর্তনটি কার্যকর করার সর্বোত্তম উপায় কী হবে?

আমরা পরিচালিত দৃষ্টান্তগুলির সার্বজনিক পূর্বরূপে আছি । এটির সাথে এখনও এটি একই সমস্যা রয়েছে GETDATE(), সুতরাং এটি এই সমস্যার সাথে সহায়তা করে না। অ্যাজুরে সরানো একটি প্রয়োজনীয়তা। এই ডাটাবেসটি সর্বদা এই সময় অঞ্চলে ব্যবহৃত হয় (এবং ব্যবহৃত হবে)।

উত্তর:


17
  1. এসকিউএল ফাইলটিতে ডাটাবেস অবজেক্টের সংজ্ঞা রফতানি করতে এসকিউএল সার্ভার সরঞ্জামটি ব্যবহার করুন যাতে অন্তর্ভুক্ত হওয়া উচিত: সারণী, দর্শন, ট্রিগার, এসপি, ফাংশন এবং আরও

  2. কোনও পাঠ্য সম্পাদক যা আপনাকে পাঠ্য সন্ধান করতে "GETDATE()"এবং এটির সাথে প্রতিস্থাপন করতে দেয় সেগুলি ব্যবহার করে এসকিউএল ফাইল সম্পাদন করুন (প্রথমে একটি ব্যাকআপ করুন)"[dbo].[getlocaldate]()"

  3. আপনার ডাটাবেস অবজেক্ট তৈরি করতে আজুর এসকিউএলে সম্পাদিত এসকিউএল ফাইলটি চালান ...

  4. ডেটা মাইগ্রেশন কার্যকর করুন।

এখানে আপনার কাছে অ্যাজুর ডকুমেন্টেশন থেকে একটি রেফারেন্স রয়েছে: এসকিউএল অ্যাজুরির জন্য স্ক্রিপ্ট তৈরি করা


যদিও অনুশীলনে এই পদ্ধতির শোনার চেয়ে জটিল, তবে এটি সম্ভবত সঠিক এবং সেরা উত্তর। আমাকে অনেকগুলি স্কোরের মতো কাজগুলি করতে হয়েছিল এবং আমি উপলব্ধ প্রতিটি পদ্ধতির চেষ্টা করেছি এবং এর চেয়ে ভাল কিছু আমি খুঁজে পাইনি (বা এমনকি খুব কাছেও, সত্যিই)। অন্যান্য পন্থাগুলি প্রথমে দুর্দান্ত বলে মনে হয় তবে এগুলি দ্রুত তদারকির কাজ এবং গোটচেগুলির একটি রাত্রিবিশেষে পরিণত হয়।
আরবেরি ইয়ং

15

এই পরিবর্তনটি কার্যকর করার সর্বোত্তম উপায় কী হবে?

আমি অন্যভাবে কাজ করব। আপনার সমস্ত টাইমস্ট্যাম্পগুলি ডাটাবেসে ইউটিসিতে রূপান্তর করুন এবং কেবল ইউটিসি ব্যবহার করুন এবং প্রবাহের সাথে যান। যদি আপনার কোনও আলাদা টিজেডের টাইমস্ট্যাম্পের প্রয়োজন হয় তবে আপনি একটি জেনারেট কলাম তৈরি করতে পারেন AT TIME ZONE(যেমন আপনি উপরে করেছিলেন) যে নির্দিষ্ট টিজেডে (সময়ের জন্য অ্যাপ্লিকেশনটির) স্ট্যাম্পকে রেন্ডার করে। তবে, আমি ইউটিসি কেবল অ্যাপটিতে ফিরে আসার বিষয়টি গুরুত্ব সহকারে বিবেচনা করব এবং অ্যাপটিতে সেই যুক্তিটি - ডিসপ্লে লজিক writing


যদি এটি কেবল একটি ডাটাবেস জিনিস ছিল, আমি এটি বিবেচনা করতে পারি, তবে সেই পরিবর্তনটি অন্যান্য অনেক অ্যাপ এবং সফ্টওয়্যারকে প্রভাবিত করে যার জন্য গুরুতর পুনঃসংশোধক প্রয়োজন। সুতরাং, দুঃখের বিষয়, এটি আমার পছন্দ নয়
লামাক

5
"অ্যাপস এবং সফ্টওয়্যার" কারওই গেটডেট () ব্যবহার করবেন না এর আপনার কী গ্যারান্টি থাকবে? অর্থাত অ্যাপ্লিকেশনগুলিতে এম্বেড করা এসকিএল কোড। আপনি যদি এটির গ্যারান্টি দিতে না পারেন, অন্য কোনও ফাংশন ব্যবহার করতে ডাটাবেসকে রিফ্যাক্ট করা কেবলমাত্র অসঙ্গতি ঘটাবে।
মিস্টার মাগু

@ মিস্টারমাগু এটি দোকানের অনুশীলনের উপর নির্ভর করে, বেশ স্পষ্টভাবে আমি মনে করি এটি খুব সামান্য উদ্বেগ, এবং সমস্যাটি ঘিরে কাজ করার জন্য প্রশ্নটি জিজ্ঞাসা করতে আমি যতটা সময় নিচ্ছি তা আসলেই ঠিক করতে আমি দেখতে পাচ্ছি না। আকর্ষণীয় হবে যদি এই প্রশ্নটি আজুর না হয় , কারণ আমি এটি হ্যাক করে আপনাকে আরও প্রতিক্রিয়া জানাতে পারি। মেঘ স্টাফগুলি চুষে ফেলে: তারা এটিকে সমর্থন করে না, তাই আপনাকে আপনার পক্ষে কিছু পরিবর্তন করতে হবে। আমি আমার উত্তরে প্রদত্ত রুটটিতে যেতে পছন্দ করব এবং এটি সঠিকভাবে করার জন্য সময় ব্যয় করব। এছাড়াও, আপনি সবসময় তিয়াসের মতো আজুরে চলে যাওয়ার পরে কোনও কাজ করবে বলে কোনও গ্যারান্টি নেই।
ইভান ক্যারল

@ ইভানক্রোল, দুঃখিত আমি কেবল আমার মন্তব্যটি আবার পড়েছি এবং আমি আমার উদ্দেশ্যটি ভালভাবে প্রকাশ করি নি! আমি আপনার উত্তরটির সমর্থক হতে চেয়েছি (উত্সাহিত) এবং এই বিষয়টি উত্থাপন করেছিলাম যে ডাটাবেসে গেটডেট () ব্যবহারের পরিবর্তনের জন্য getlocaldate () ব্যবহারের পরামর্শগুলি অ্যাপ্লিকেশনটির পক্ষ থেকে অসঙ্গতিগুলিতে উন্মুক্ত রেখে দেবে, এবং ততোধিক মাত্র একটি একটি বড় সমস্যা প্লাস্টার স্টিকিং। 100% আপনার উত্তরের সাথে একমত, মূল সমস্যাটি ঠিক করা সঠিক পদ্ধতি।
মিস্টার মাগু

@ মিস্টারমাগু আমি আপনার উদ্বেগ বুঝতে পেরেছি, তবে এই ক্ষেত্রে আমি গ্যারান্টি দিতে পারি যে অ্যাপস এবং সফ্টওয়্যার কেবলমাত্র সঞ্চিত প্রক্রিয়াগুলির মাধ্যমে ডাটাবেসের সাথে যোগাযোগ করে
লামাক

6

রফতানি, ম্যানুয়ালি সম্পাদনা এবং পুনরায় কাজ করার পরিবর্তে আপনি সরাসরি ডাটাবেসে কিছু করার চেষ্টা করতে পারেন যেমন:

DECLARE C CURSOR FOR
        SELECT sm.definition, so.type
        FROM   sys.objects so
        JOIN   sys.all_sql_modules sm ON sm.object_id = so.object_id
        WHERE  so.type IN ('P', 'V')
        ORDER BY so.name
DECLARE @SQL NVARCHAR(MAX), @ojtype NVARCHAR(MAX)
OPEN C
FETCH NEXT FROM C INTO @SQL, @ojtype
WHILE @@FETCH_STATUS = 0 BEGIN
    IF @objtype = 'P' SET @SQL = REPLACE(@SQL, 'CREATE PROCEDURE', 'ALTER PROCEDURE') 
    IF @objtype = 'V' SET @SQL = REPLACE(@SQL, 'CREATE VIEW'     , 'ALTER VIEW'     ) 
    SET @SQL = REPLACE(@SQL, 'GETDATE()', '[dbo].[getlocaldate]()') 
    --PRINT @SQL
    EXEC (@SQL)
    FETCH NEXT FROM C INTO @SQL, @ojtype
END
CLOSE C
DEALLOCATE C

অবশ্যই এটি ফাংশন, ট্রিগার, এবং আরও অনেক কিছু মোকাবেলায় প্রসারিত করা extend

কয়েকটি সতর্কতা রয়েছে:

  • আপনার কিছুটা উজ্জ্বল হতে হবে CREATEএবং PROCEDURE/ VIEW/ এর মধ্যে বিভিন্ন / অতিরিক্ত সাদা স্থানের সাথে ডিল করতে হবে <other>। এর পরিবর্তে REPLACEআপনি সম্ভবত CREATEজায়গাটি ছেড়ে যেতে এবং DROPপ্রথমে মৃত্যুদণ্ড কার্যকর করতে পছন্দ করতে পারেন তবে এই ঝুঁকিটি sys.dependsএবং ঘাতক বন্ধুরা যেখানে ALTERযেতে পারে না তা ছাড়তে পারে, এমনকি যদি আপনার ALTERব্যর্থ হয় তবে অন্তত বিদ্যমান অবজেক্টটি স্থানে রয়েছে যেখানে আপনি থাকতে পারেন DROP+ CREATEনা.

  • আপনি কোড কোন "চালাক" থাকে অ্যাড-হক TSQL সঙ্গে নিজস্ব স্কিমা পরিবর্তন তারপর আপনি নিশ্চিত করুন যে অনুসন্ধান করতে এবং জন্য প্রতিস্থাপন করতে হবে মত গন্ধ পাচ্ছি CREATE> - ALTERযে হস্তক্ষেপ করে না।

  • আপনি কার্সার ব্যবহার করুন বা রফতানি + সম্পাদনা + চালানোর পদ্ধতিগুলি ব্যবহার করুন না কেন আপনি অপারেশন শেষে পুরো অ্যাপ্লিকেশন (গুলি) রিগ্রেশন পরীক্ষা করতে চাইবেন।

আমি অতীতে একই ধরণের স্কিমা-বিস্তৃত আপডেটগুলি করতে এই পদ্ধতিটি ব্যবহার করেছি। এটি কিছুটা হ্যাক, এবং বেশ কুৎসিত বোধ করে তবে কখনও কখনও এটি সহজতম / দ্রুততম উপায়।

ডিফল্ট এবং অন্যান্য সীমাবদ্ধতাগুলিও একইভাবে সংশোধন করা যায়, যদিও সেগুলি কেবল পরিবর্তিত না হয়ে বাদ দেওয়া এবং পুনরায় তৈরি করা যায়। কিছুটা এইরকম:

DECLARE C CURSOR FOR
        SELECT AlterDefaultSQL = 'ALTER TABLE [' +st.name+ '] DROP CONSTRAINT [' + si.name + '];'
                               + CHAR(10)
                               + 'ALTER TABLE [' +st.name+ '] ADD CONSTRAINT [' + si.name + '] DEFAULT '+REPLACE(si.definition, 'GETDATE()', '[dbo].[getlocaldate]()')+' FOR '+sc.name+';'
        FROM   sys.tables st
        JOIN   sys.default_constraints si ON si.parent_object_id = st.object_id
        JOIN   sys.columns sc ON sc.default_object_id = si.object_id
DECLARE @SQL NVARCHAR(MAX)
OPEN C
FETCH NEXT FROM C INTO @SQL
WHILE @@FETCH_STATUS = 0 BEGIN
    --PRINT @SQL
    EXEC (@SQL)
    FETCH NEXT FROM C INTO @SQL
END
CLOSE C
DEALLOCATE C

আরও কিছু মজাদার যেগুলির সাথে আপনার লড়াইয়ের প্রয়োজন হতে পারে: আপনি যদি সময়ের সাথে ভাগ করে নিচ্ছেন তবে সেই অংশগুলিকেও পরিবর্তনের প্রয়োজন হতে পারে। সময়কালে আরও কণিকভাবে বিভাজনের সময় আপনার বিরল ঘটনা খুব কমই দেখা যায় যেখানে DATETIMEপার্টিশন ফাংশন দ্বারা পূর্ববর্তী বা পরের দিন টাইমজিনের উপর নির্ভর করে আপনার পার্টিশনগুলি আপনার স্বাভাবিক প্রশ্নের সাথে নিরবচ্ছিন্ন রেখে দেওয়া হতে পারে issues


হ্যাঁ, সতর্কতামূলক বিষয়গুলি এটিকে শক্ত করে তোলে। এছাড়াও, এটি কলামের ডিফল্ট মানগুলিতে বিবেচনা করে না। যাইহোক ধন্যবাদ
লামাক

কলামের ডিফল্ট মান এবং অন্যান্য সীমাবদ্ধতাগুলি sysস্কিমাতে এবং প্রোগ্রামগতভাবে সংশোধন করার জন্যও স্ক্যান করা যেতে পারে ।
ডেভিড স্পিললেট

উদাহরণস্বরূপ প্রতিস্থাপন CREATE OR ALTER PROCEDUREকিছু কোড-প্রজন্মের সমস্যাগুলির আশেপাশে সহায়তা করে; এখনও সমস্যা থাকতে পারে যেহেতু সঞ্চিত সংজ্ঞাটি পড়বে CREATE PROCEDURE(তিন! স্পেস) এবং এটি নাও মিলছে CREATE PROCEDUREনা CREATE OR ALTER PROCEDURE… ._।
দ্য কনস্ট্রাক্টর

@ দ্য কনস্ট্রাক্টর - এটাই আমি আরআরটি "অতিরিক্ত হোয়াইটস্পেস" হিসাবে উল্লেখ করছি। আপনি কোনও ফাংশন লিখে CREATEএটি সম্পর্কে জানতে পারেন যা কোনও মন্তব্যের মধ্যে নেই এবং এটির পরিবর্তে প্রথমটির জন্য স্ক্যান করে। আমি অতীতে / অনুরূপ পাইনি তবে পোস্ট করার জন্য এই মুহুর্তে কার্যকারিতাটির কোডটি খুব সহজ নয়। বা যদি আপনি গ্যারান্টি দিতে পারেন তবে আপনার অবজেক্টের সংজ্ঞাগুলির কোনওটিতে পূর্ববর্তী মন্তব্য নেই CREATE, মন্তব্যগুলির বিষয়টিকে উপেক্ষা করুন এবং এর প্রথম উদাহরণটি সন্ধান করুন এবং প্রতিস্থাপন করুন CREATE
ডেভিড স্পিলিট

আমি এই পদ্ধতির অতীতে বহুবার চেষ্টা করেছি এবং ভারসাম্য বজায় রেখেছি জেনারেট-স্ক্রিপ্টস পদ্ধতির চেয়ে ভাল ছিল এবং প্রায় সবসময়ই আমি আজ যা ব্যবহার করি যদি না পরিবর্তিত বস্তুর সংখ্যা তুলনামূলকভাবে ছোট হয়ে যায়।
আরবেরি ইয়ং

5

আমি ডেভিডের উত্তরটি সত্যিই পছন্দ করি এবং প্রোগ্রাম করার পদ্ধতিতে কাজটি করার জন্য এটি উত্সাহিত করেছি।

তবে আপনি আজ এসএসএমএসের মাধ্যমে আজুরে টেস্ট-রানের জন্য এটি চেষ্টা করতে পারেন:

আপনার ডাটাবেস -> টাস্কগুলিতে -> স্ক্রিপ্টগুলি রাইট ক্লিক করুন ..

[পিছনের গল্প] আমাদের একটি জুনিয়র ডিবিএ ছিল যা আমাদের সমস্ত পরীক্ষার পরিবেশগুলি এসকিউএল ২০০৮ আর 2 তে উন্নীত করে যখন আমাদের উত্পাদনের পরিবেশ এসকিউএল ২০০৮-এ ছিল It's এটি একটি পরিবর্তন যা আমাকে আজকের দিনে সঙ্কুচিত করে তোলে। প্রোডাক্টে মাইগ্রেশন করতে, পরীক্ষা থেকে, এসকিউএল-এর মধ্যে স্ক্রিপ্ট তৈরি করতে হয়েছিল, স্ক্রিপ্টগুলি জেনারেট করে এবং উন্নত বিকল্পগুলিতে আমরা 'টেক্সটের ডেটা টাইপ স্ক্রিপ্ট: স্কিমা এবং ডেটা' বিকল্পটি ব্যবহার করে একটি বিশাল পাঠ্য ফাইল তৈরি করি। আমরা সফলভাবে আমাদের টেস্ট আর 2 ডাটাবেসগুলিকে আমাদের লিগ্যাসি এসকিউএল ২০০৮ সার্ভারগুলিতে সরিয়ে দিতে সক্ষম হয়েছি - যেখানে কোনও নিম্নোক্ত সংস্করণে পুনরুদ্ধার করা একটি ডাটাবেস কাজ করবে না। বৃহত ফাইলটি ইনপুট করতে আমরা sqlcmd ব্যবহার করেছি - এসএসএমএস পাঠ্য বাফারের জন্য ফাইলগুলি প্রায়শই বড় হয়ে যায়।

আমি এখানে যা বলছি তা হ'ল এই বিকল্পটি সম্ভবত আপনার পক্ষেও কাজ করবে। আপনাকে কেবলমাত্র একটি অতিরিক্ত পদক্ষেপ করতে হবে এবং জেনেটেড টেক্সট ফাইলটিতে [dbo] .getlocaldate দিয়ে getdate () অনুসন্ধান এবং প্রতিস্থাপন করতে হবে। (আমি অভিবাসনের আগে যদিও আপনার ফাংশনটি ডাটাবেসে রেখে দেব)।

(আমি কখনই কোনও ডেটাবেস পুনরুদ্ধারের এই ব্যান্ড-সহায়তা সম্পর্কে দক্ষ হতে চাইনি, তবে কিছুক্ষণের জন্য এটি জিনিসগুলি করার একটি ডিফ্যাক্টো পদ্ধতিতে পরিণত হয়েছিল। এবং, এটি প্রতিবার কাজ করেছিল))

আপনি যদি এই রুটটি চয়ন করেন তবে নিশ্চিত হন এবং অ্যাডভান্সড বাটনটি নির্বাচন করুন এবং পুরাতন ডাটাবেস থেকে নতুন ডাটাবেসে সরে যাওয়ার জন্য আপনার প্রয়োজনীয় সমস্ত বিকল্পগুলি (প্রতিটি পড়ুন) নির্বাচন করুন - আপনার উল্লিখিত ডিফল্টগুলির মতো। তবে এটি অ্যাজুরে কয়েকটি পরীক্ষা রান দিন। আমি বাজি ধরছি আপনি খুঁজে পেতে পারেন যে এটি একটি সমাধান যা কার্যকর - একটি পরিশ্রমের মডিকাম সহ works

এখানে চিত্র বর্ণনা লিখুন


1

গতিশীলভাবে মান পরিবর্তন করতে সমস্ত প্রোক এবং ইউডিএফ পরিবর্তন করুন

    DECLARE @Text   NVARCHAR(max), 
        @spname NVARCHAR(max), 
        @Type   CHAR(5), 
        @Sql    NVARCHAR(max) 
DECLARE @getobject CURSOR 

SET @getobject = CURSOR 
FOR SELECT sc.text, 
           so.NAME, 
           so.type 
    FROM   sys.syscomments sc 
           INNER JOIN sysobjects so 
                   ON sc.id = so.id 
    WHERE  sc.[text] LIKE '%getdate()%' 

--and type in('P','FN') 
OPEN @getobject 

FETCH next FROM @getobject INTO @Text, @spname, @Type 

WHILE @@FETCH_STATUS = 0 
  BEGIN 
      IF ( @Type = 'P' 
            OR @Type = 'FN' ) 
        SET @Text = Replace(@Text, 'getdate', 'dbo.getlocaldate') 

      SET @Text = Replace(@Text, 'create', 'alter') 

      EXECUTE Sp_executesql 
        @Text 

      PRINT @Text 

      --,@spname,@Type 
      FETCH next FROM @getobject INTO @Text, @spname, @Type 
  END 

CLOSE @getobject 

DEALLOCATE @getobject  

 

    CREATE PROCEDURE [dbo].[Testproc1] 
AS 
    SET nocount ON; 

  BEGIN 
      DECLARE @CurDate DATETIME = Getdate() 
  END

মন্তব্য করা সিসোবজেক্টস কলাম শর্ত টাইপ করুন। আমার স্ক্রিপ্টটি কেবল প্রোক এবং ইউডিএফকে পরিবর্তন করবে।

এই স্ক্রিপ্টটি Default Constraintযা ধারণ করে তা পরিবর্তন করে দেবেGetDate()

    DECLARE @TableName      VARCHAR(300), 
        @constraintName VARCHAR(300), 
        @colName        VARCHAR(300), 
        @Sql            NVARCHAR(max) 
DECLARE @getobject CURSOR 

SET @getobject = CURSOR 
FOR SELECT ds.NAME, 
           sc.NAME AS colName, 
           so.NAME AS Tablename 
    --,ds.definition 
    FROM   sys.default_constraints ds 
           INNER JOIN sys.columns sc 
                   ON ds.object_id = sc.default_object_id 
           INNER JOIN sys.objects so 
                   ON so.object_id = ds.parent_object_id 
    WHERE  definition LIKE '%getdate()%' 

OPEN @getobject 

FETCH next FROM @getobject INTO @constraintName, @colName, @TableName 

WHILE @@FETCH_STATUS = 0 
  BEGIN 
      SET @Sql = 'ALTER TABLE ' + @TableName 
                 + ' DROP CONSTRAINT ' + @constraintName + '; ' 
                 + Char(13) + Char(10) + '           ' + Char(13) + Char(10) + '' 
      SET @Sql = @Sql + ' ALTER TABLE ' + @TableName 
                 + ' ADD CONSTRAINT ' + @constraintName 
                 + '          DEFAULT dbo.GetLocaledate() FOR ' 
                 + @colName + ';' + Char(13) + Char(10) + '          ' + Char(13) 
                 + Char(10) + '' 

      PRINT @Sql 

      EXECUTE sys.Sp_executesql 
        @Sql 

      --,@spname,@Type 
      FETCH next FROM @getobject INTO @constraintName, @colName, @TableName 
  END 

CLOSE @getobject 

DEALLOCATE @getobject   

1

আমি ইভান ক্যারোলসের উত্তরটিকে অগ্রাহ্য করেছি, কারণ আমি মনে করি এটি সেরা সমাধান। আমি আমার সহকর্মীদের বোঝাতে সক্ষম হইনি যে তাদের প্রচুর সি # কোড পরিবর্তন করা উচিত, তাই ডেভিড স্পিলিট লিখেছেন কোডটি আমাকে ব্যবহার করতে হয়েছিল। আমি ইউডিএফ, ডায়নামিক এসকিউএল এবং স্কিমাস (সমস্ত কোড "ডিবিও।" ব্যবহার করে না) এর সাথে বেশ কয়েকটি সমস্যা সমাধান করেছি:

DECLARE C CURSOR LOCAL STATIC FOR
        SELECT sm.definition, so.type
        FROM   sys.objects so
        JOIN   sys.all_sql_modules sm ON sm.object_id = so.object_id
        WHERE  so.type IN ('P', 'V')
        AND CHARINDEX('getdate()', sm.definition) > 0
        ORDER BY so.name

DECLARE @SQL NVARCHAR(MAX), @objtype NVARCHAR(MAX)
OPEN C
WHILE 1=1 BEGIN
    FETCH NEXT FROM C INTO @SQL, @objtype
    IF @@FETCH_STATUS <> 0 BREAK

    IF @objtype = 'P' SET @SQL = REPLACE(@SQL, 'CREATE PROCEDURE', 'ALTER PROCEDURE') 
    IF @objtype = 'P' SET @SQL = REPLACE(@SQL, 'CREATE   PROCEDURE', 'ALTER PROCEDURE') /* when you write "create or alter proc" */
    IF @objtype = 'V' SET @SQL = REPLACE(@SQL, 'CREATE VIEW'     , 'ALTER VIEW'     ) 
    IF CHARINDEX('getdate())''', @sql) > 0 BEGIN  /* when dynamic SQL is used */
        IF CHARINDEX('utl.getdate())''', @sql) = 0 SET @SQL = REPLACE(@SQL, 'GETDATE()', 'utl.getdate()') 
    end
    ELSE begin
        SET @SQL = REPLACE(@SQL, 'GETDATE()', 'CONVERT(DATETIME, CONVERT(datetimeoffset,  SYSDATETIME()) AT TIME ZONE ''Central Europe Standard Time'')') 
    end
    EXEC dbo.LongPrint @String = @sql    
    EXEC (@SQL)
END
CLOSE C
DEALLOCATE C

এবং ডিফল্ট সীমাবদ্ধতা এটি:

DECLARE C CURSOR LOCAL STATIC FOR
        SELECT AlterDefaultSQL = 'ALTER TABLE [' +sch.name+ '].[' +st.name+ '] DROP CONSTRAINT [' + si.name + '];'
                               + CHAR(10)
                               + 'ALTER TABLE [' +sch.name+ '].[' +st.name+ '] ADD CONSTRAINT [' + si.name + '] DEFAULT '+REPLACE(si.definition, 'GETDATE()', 'CONVERT(DATETIME, CONVERT(datetimeoffset,  SYSDATETIME()) AT TIME ZONE ''Central Europe Standard Time'')')+' FOR '+sc.name+';'
        FROM   sys.tables st
        JOIN   sys.default_constraints si ON si.parent_object_id = st.object_id
        JOIN   sys.columns sc ON sc.default_object_id = si.object_id
        INNER JOIN sys.schemas sch ON sch.schema_id = st.schema_id
        WHERE CHARINDEX('getdate()', si.definition) > 0
        ORDER BY st.name, sc.name

DECLARE @SQL NVARCHAR(MAX)
OPEN C
WHILE 1=1 BEGIN
    FETCH NEXT FROM C INTO @SQL
    IF @@FETCH_STATUS <> 0 BREAK

    EXEC dbo.LongPrint @String = @sql  
    EXEC (@SQL)
    FETCH NEXT FROM C INTO @SQL
END
CLOSE C
DEALLOCATE C


ইউডিএফস
একটি ইউডিএফ ব্যবহার করার পরামর্শ যা আজকের তারিখ এবং সময়টি সুন্দর দেখায়, তবে ইউডিএফগুলির সাথে এখনও যথেষ্ট পারফরম্যান্সের সমস্যা রয়েছে বলে আমি মনে করি খুব দীর্ঘ এবং কুরুচিপূর্ণ সময়ে টাইম জোন সমাধানটি বেছে নিয়েছি।

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