Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

MS SQL सर्वर में डेटाबेस स्कीमा परिवर्तन का स्वचालित डेटा संग्रह

परिचय

क्या आपने कभी ऐसी स्थिति का सामना किया है जब आपको किसी संग्रहीत कार्यविधि या दृश्य में बहुत तेज़ी से परिवर्तन करने की आवश्यकता होती है? मेरे पास, बहुत बार, विशेष रूप से कार्यान्वयन चरण में है। दुर्भाग्य से, एक संस्करण नियंत्रण प्रणाली इस मामले में मदद नहीं कर सकती है। फिर भी, मैं कैसे समझ सकता हूँ कि कुछ संशोधित किया गया है, और कब?

यह आलेख MS SQL सर्वर में डेटाबेस स्कीमा परिवर्तनों के बारे में स्वचालित डेटा संग्रह के संभावित समाधान का वर्णन करता है। हमेशा की तरह, मुझे कोई वैकल्पिक समाधान सुनकर खुशी होगी।

समाधान

  1. दो टेबल बनाएं:पहला प्रत्येक डेटाबेस के लिए होगा, दूसरा एक - सभी डेटाबेस के लिए:
    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
  2. एक डेटाबेस के लिए एक डीडीएल-ट्रिगर बनाएं जो योजना परिवर्तन एकत्र करता है:
    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

मैं एक फिल्टर को समायोजित करने और पूरे सर्वर के लिए डीडीएल-ट्रिगर नहीं बनाने की सलाह देता हूं। यह बेकार है, क्योंकि आपको बहुत सारी अनावश्यक जानकारी मिल जाएगी। इस मामले में, प्रत्येक डेटाबेस के लिए एक ट्रिगर बनाना बेहतर होता है।
हालांकि, आपको जटिल संचालन के दौरान इस ट्रिगर को बंद करना होगा, उदाहरण के लिए, प्रतिकृति। लेकिन बाद में, आप इसे फिर से चालू कर पाएंगे।

  1. आपको एक ही टेबल में जानकारी इकट्ठी करनी होगी। उदाहरण के लिए, आप इसे सप्ताह में एक बार SQL सर्वर एजेंट में किसी कार्य के साथ कर सकते हैं।
  2. अपनी पसंद के अनुसार सब कुछ एक टेबल में इकट्ठा करना संभव है।

इसके अतिरिक्त, मैं पुराने डेटा को हटाने की सलाह देता हूं।

परिणाम

इस लेख में, मैंने MS SQL सर्वर में डेटाबेस योजनाओं के परिवर्तनों के बारे में एक स्वचालित डेटा संग्रह को लागू करने के एक उदाहरण का विश्लेषण किया है। यह हमें यह पता लगाने की अनुमति देता है कि क्या और कब संशोधित किया गया है, और यदि आवश्यक हो, तो उन्हें वापस करने के लिए। सामान्य तौर पर, यह समाधान कार्यान्वयन चरण में सहायक हो सकता है जहां बहुत सारी गलतियां होती हैं और जब हमारे पास डेटाबेस के विभिन्न संस्करणों का विश्लेषण किया जाता है। यदि आप परिवर्तनों का कारण जानना चाहते हैं, तो आप एक संशोधन इतिहास प्राप्त करके ऐसा कर सकते हैं।

यह भी पढ़ें:

MS SQL सर्वर में पूर्ण किए गए कार्यों के बारे में स्वचालित डेटा संग्रह


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL सर्वर में डेटाबेस पर परिवर्तन डेटा कैप्चर (सीडीसी) को अक्षम कैसे करें - SQL सर्वर ट्यूटोरियल

  2. SqlDataAdapter.भरने की विधि धीमी

  3. SQL सर्वर में एक डेटाबेस से दूसरे डेटाबेस (निर्यात-आयात) में तालिका की प्रतिलिपि बनाने की पूरी प्रक्रिया

  4. SQL क्वेरी ऑप्टिमाइज़ेशन:बेहतर प्रदर्शन के लिए सर्वोत्तम अभ्यास

  5. एसक्यूएल सर्वर 2008 पेजिंग विधियां?