এসকিউএল সার্ভার ডিডিএল এর সাথে লেনদেনগুলি কীভাবে ব্যবহার করবেন?


20

আমার একটি লগইন টেবিল রয়েছে যাতে সমস্ত সন্নিবেশগুলি একক সঞ্চিত প্রক্রিয়া দ্বারা সম্পন্ন হয়।

CREATE TABLE dbo.LogTable(
    LogRefnr int IDENTITY(1, 1) NOT NULL,
    LogQuery varchar(255) NOT NULL,
    LogTime datetime NOT NULL,
    logQueryDuration int NULL,
    LogSessionID int NULL,
 CONSTRAINT PK_Log PRIMARY KEY CLUSTERED  (LogRefnr)
)
go


Create procedure DBO.LogInsert ( @Query varchar(255), @time datetime, @duration int, @SessinID int) as
begin
    Insert into LogTable ( LogRefnr, LogQuery, logQueryDuration, LogSessionID)
    Values  (@Query, @time, @duration, @SessinID);
end;
GO

বর্তমানে সেই টেবিলটিতে প্রায় 45500000 সারি রয়েছে এবং আমি সরাসরি অন্য টেবিলে লগিং করতে চাই।

আমার ধারণাটি নিম্নলিখিত স্ক্রিপ্টটি ব্যবহার করা use

begin Transaction

exec sp_rename LogTable, LogTableOld;

CREATE TABLE dbo.LogTable(
    LogRefnr int IDENTITY(46000000, 1) NOT NULL,            -- greater than select max(LogRefnr) from LogTableOld
    LogQuery varchar(255) NOT NULL,
    LogTime datetime NOT NULL,
    logQueryDuration int NULL,
    LogSessionID int NULL,
 CONSTRAINT PK_Log2 PRIMARY KEY CLUSTERED  (LogRefnr);
)
go

sp_recompile LogTable;
go

Commit;

এটি কাজ করে এবং লগইনসর্ট কল করার অন্যান্য পদ্ধতির নূন্যতম প্রভাব ফেলে?


2
আপনার sp_recompile দরকার নেই। Dbo.LogTable অবজেক্টটি ব্যবহার করে এমন কোনও অবজেক্টের জন্য পদ্ধতি ক্যাশে স্বয়ংক্রিয়ভাবে মেয়াদ শেষ হয়ে যাবে যখন আপনি বস্তুর নাম পরিবর্তন করবেন।
mrdenny

উত্তর:


24

হ্যাঁ. লেনদেনগুলি ডিডিএল এবং স্প্যান ব্যাচে প্রয়োগ হয়।

আমি এরকম কিছু করতাম সম্পূর্ণ বিচ্ছিন্নতা এবং XACT_ABORT যা কোনও ত্রুটির কারণে একটি রোলব্যাককে বাধ্য করবে তা নিশ্চিত করতে সিরিয়ালিজেবল আইসোলেশনের ব্যবহারটি নোট করুন।

SET XACT_ABORT ON
GO
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
GO
begin Transaction
GO
exec sp_rename LogTable, LogTableOld;
GO
CREATE TABLE dbo.LogTable(
    LogRefnr int IDENTITY(46000000, 1) NOT NULL,            -- greater than select max(LogRefnr) from LogTableOld
    LogQuery varchar(255) NOT NULL,
    LogTime datetime NOT NULL,
    logQueryDuration int NULL,
    LogSessionID int NULL,
 CONSTRAINT PK_Log2 PRIMARY KEY CLUSTERED  (LogRefnr);
)
go
EXEC sp_recompile LogTable;
go

Commit;

1
আপনি কি এসকিউএল সার্ভারের লেনদেনগুলি ডিডিএল এবং স্প্যান ব্যাচের ক্ষেত্রে প্রযোজ্য তা উল্লেখ করে কোনও লিঙ্কটিতে লিঙ্ক করতে পারেন? সুস্পষ্ট BOL পৃষ্ঠাগুলি এই উল্লেখ না।
নিক চামাস

2
@ নিক: আমি কখনই সন্ধান করিনি। আমি জানি যে এটি আমি সমস্ত সময় ব্যবহার করার সাথে সাথে কাজ করে। আমাকে বিশ্বাস করা বা আমাকে অস্বীকার করা বা নিজের জন্য এটি চেষ্টা করা আপনার উপর নির্ভর করে। অবশ্যই, লেনদেনগুলি আমার ব্যবহার করা বিভিন্ন সেট স্টেটমেন্টের মতো সংযোগ অনুযায়ী হয় । একটি সংযোগে একাধিক ব্যাচ থাকে। আপনার আর কী দরকার?
gbn

আমি আপনাকে বিশ্বাস করি, তবে আমি এমন কিছু "অফিসিয়াল" ডকুমেন্টেশনের আশা করছিলাম যা স্পষ্টভাবে লেনদেনের জন্য আবদ্ধ এবং কোনটি নয় এমন সমস্ত ক্রিয়াকলাপ গণ্য করে। উদাহরণস্বরূপ, সারণী ভেরিয়েবলগুলি লেনদেন রোলব্যাকগুলি দ্বারা প্রভাবিত হয় না (যা আমার কাছে ন্যূনতম আশ্চর্যের নীতি লঙ্ঘন করে )।
নিক চাম্মাস

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