SQL सर्वर DDL के साथ लेनदेन का उपयोग कैसे करें?


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 पंक्तियां हैं और मैं एक अलग तालिका में लॉगिंग को निर्देशित करना चाहता हूं।

मेरा विचार निम्नलिखित स्क्रिप्ट का उपयोग करना है

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 की आवश्यकता नहीं है। ऑब्जेक्ट का उपयोग करने वाले किसी भी ऑब्जेक्ट के लिए प्रक्रिया कैश। वस्तु का नाम बदलने पर स्वचालित रूप से समाप्त हो जाएगी।
mrdenny

जवाबों:


24

हाँ। लेनदेन डीडीएल और स्पैन बैचों पर लागू होते हैं।

मैं ऐसा कुछ करूँगा। पूर्ण अलगाव और XACT_ABORT सुनिश्चित करने के लिए SERIALIZABLE ISOLATION के उपयोग पर ध्यान दें जो किसी भी त्रुटि पर एक रोलबैक को बाध्य करेगा।

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
क्या आप SQL सर्वर लेनदेन को DDL और स्पैन बैचों पर लागू होने वाले संदर्भ से जोड़ सकते हैं? स्पष्ट बोल पृष्ठों इस का उल्लेख नहीं है।
निक चामास 17

2
@ निक: मैंने कभी किसी की तलाश नहीं की। मुझे पता है कि यह काम करता है क्योंकि मैं इसे हर समय उपयोग करता हूं। मेरे ऊपर विश्वास करने के लिए या मुझे नापसंद करने के लिए या अपने लिए प्रयास करने के लिए। बेशक, लेन-देन प्रति कनेक्शन हैं जैसे कि विभिन्न सेट स्टेटमेंट मैं उपयोग करता हूं। एक कनेक्शन में कई बैच होते हैं। आपको और क्या चाहिए?
gbn

मुझे आप पर विश्वास है, लेकिन मैं कुछ "आधिकारिक" दस्तावेज की उम्मीद कर रहा था, जो स्पष्ट लेनदेन से जुड़े सभी कार्यों की गणना करता है और जो नहीं हैं। उदाहरण के लिए, लेन-देन रोलबैक से टेबल चर प्रभावित नहीं होते हैं (जो, मेरे लिए, सिद्धांत के सिद्धांत का उल्लंघन करता है )।
निक चामास

2
लगभग समान कोड, लेकिन लेनदेन काम नहीं करता है: stackoverflow.com/questions/47868213/…
aleyush
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.