परिचय
क्या आपने कभी ऐसी स्थिति का सामना किया है जब आपको किसी संग्रहीत कार्यविधि या दृश्य में बहुत तेज़ी से परिवर्तन करने की आवश्यकता होती है? मेरे पास, बहुत बार, विशेष रूप से कार्यान्वयन चरण में है। दुर्भाग्य से, एक संस्करण नियंत्रण प्रणाली इस मामले में मदद नहीं कर सकती है। फिर भी, मैं कैसे समझ सकता हूँ कि कुछ संशोधित किया गया है, और कब?
यह आलेख MS SQL सर्वर में डेटाबेस स्कीमा परिवर्तनों के बारे में स्वचालित डेटा संग्रह के संभावित समाधान का वर्णन करता है। हमेशा की तरह, मुझे कोई वैकल्पिक समाधान सुनकर खुशी होगी।
समाधान
- दो टेबल बनाएं:पहला प्रत्येक डेटाबेस के लिए होगा, दूसरा एक - सभी डेटाबेस के लिए:
USE [DATABASE_NAME] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [srv].[ddl_log]( [DDL_Log_GUID] [uniqueidentifier] NOT NULL, [PostTime] [datetime] NOT NULL, [DB_Login] [nvarchar](255) NULL, [DB_User] [nvarchar](255) NULL, [Event] [nvarchar](255) NULL, [TSQL] [nvarchar](max) NULL, CONSTRAINT [PK_ddl_log] PRIMARY KEY CLUSTERED ( [DDL_Log_GUID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] GO ALTER TABLE [srv].[ddl_log] ADD CONSTRAINT [DF_ddl_log_DDL_Log_GUID] DEFAULT (newid()) FOR [DDL_Log_GUID] GO USE [DATABASE_NAME] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [srv].[ddl_log_all]( [DDL_Log_GUID] [uniqueidentifier] NOT NULL, [Server_Name] [nvarchar](255) NOT NULL, [DB_Name] [nvarchar](255) NOT NULL, [PostTime] [datetime] NOT NULL, [DB_Login] [nvarchar](255) NULL, [DB_User] [nvarchar](255) NULL, [Event] [nvarchar](255) NULL, [TSQL] [nvarchar](max) NULL, [InsertUTCDate] [datetime] NOT NULL, CONSTRAINT [PK_ddl_log_all] PRIMARY KEY CLUSTERED ( [DDL_Log_GUID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] GO ALTER TABLE [srv].[ddl_log_all] ADD CONSTRAINT [DF_ddl_log_all_DDL_Log_GUID] DEFAULT (newid()) FOR [DDL_Log_GUID] GO ALTER TABLE [srv].[ddl_log_all] ADD CONSTRAINT [DF_ddl_log_all_InsertUTCDate] DEFAULT (getutcdate()) FOR [InsertUTCDate] GO
- एक डेटाबेस के लिए एक डीडीएल-ट्रिगर बनाएं जो योजना परिवर्तन एकत्र करता है:
USE [DATABASE_NAME] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TRIGGER [SchemaLog] ON DATABASE --ALL SERVER FOR DDL_DATABASE_LEVEL_EVENTS AS SET NOCOUNT ON; SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; DECLARE @data XML begin try if(CURRENT_USER<>'NT AUTHORITY\NETWORK SERVICE' and SYSTEM_USER<>'NT AUTHORITY\NETWORK SERVICE') begin SET @data = EVENTDATA(); INSERT srv.ddl_log( PostTime, DB_Login, DB_User, Event, TSQL ) select GETUTCDATE(), CONVERT(nvarchar(255), SYSTEM_USER), CONVERT(nvarchar(255), CURRENT_USER), @data.value('(/EVENT_INSTANCE/EventType)[1]', 'nvarchar(255)'), @data.value('(/EVENT_INSTANCE/TSQLCommand)[1]', 'nvarchar(max)') where @data.value('(/EVENT_INSTANCE/EventType)[1]', 'nvarchar(255)') not in('UPDATE_STATISTICS', 'ALTER_INDEX') and @data.value('(/EVENT_INSTANCE/TSQLCommand)[1]', 'nvarchar(max)') not like '%Msmerge%'; --there is no need in tracking changes of replication objects end end try begin catch end catch GO SET ANSI_NULLS OFF GO SET QUOTED_IDENTIFIER OFF GO ENABLE TRIGGER [SchemaLog] ON DATABASE GO
मैं एक फिल्टर को समायोजित करने और पूरे सर्वर के लिए डीडीएल-ट्रिगर नहीं बनाने की सलाह देता हूं। यह बेकार है, क्योंकि आपको बहुत सारी अनावश्यक जानकारी मिल जाएगी। इस मामले में, प्रत्येक डेटाबेस के लिए एक ट्रिगर बनाना बेहतर होता है।
हालांकि, आपको जटिल संचालन के दौरान इस ट्रिगर को बंद करना होगा, उदाहरण के लिए, प्रतिकृति। लेकिन बाद में, आप इसे फिर से चालू कर पाएंगे।
- आपको एक ही टेबल में जानकारी इकट्ठी करनी होगी। उदाहरण के लिए, आप इसे सप्ताह में एक बार SQL सर्वर एजेंट में किसी कार्य के साथ कर सकते हैं।
- अपनी पसंद के अनुसार सब कुछ एक टेबल में इकट्ठा करना संभव है।
इसके अतिरिक्त, मैं पुराने डेटा को हटाने की सलाह देता हूं।
परिणाम
इस लेख में, मैंने MS SQL सर्वर में डेटाबेस योजनाओं के परिवर्तनों के बारे में एक स्वचालित डेटा संग्रह को लागू करने के एक उदाहरण का विश्लेषण किया है। यह हमें यह पता लगाने की अनुमति देता है कि क्या और कब संशोधित किया गया है, और यदि आवश्यक हो, तो उन्हें वापस करने के लिए। सामान्य तौर पर, यह समाधान कार्यान्वयन चरण में सहायक हो सकता है जहां बहुत सारी गलतियां होती हैं और जब हमारे पास डेटाबेस के विभिन्न संस्करणों का विश्लेषण किया जाता है। यदि आप परिवर्तनों का कारण जानना चाहते हैं, तो आप एक संशोधन इतिहास प्राप्त करके ऐसा कर सकते हैं।
यह भी पढ़ें:
MS SQL सर्वर में पूर्ण किए गए कार्यों के बारे में स्वचालित डेटा संग्रह