Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Pengumpulan Data Otomatis Perubahan Skema Basis Data di MS SQL Server

Pengantar

Pernahkah Anda menghadapi situasi ketika Anda perlu membuat perubahan dalam prosedur tersimpan atau tampilan dengan sangat cepat? Saya pernah, sangat sering, terutama pada tahap implementasi. Sayangnya, sistem kontrol versi tidak dapat membantu dalam kasus ini. Namun, bagaimana saya bisa memahami bahwa ada sesuatu yang telah diubah, dan kapan?

Artikel ini menjelaskan solusi yang mungkin untuk pengumpulan data otomatis tentang perubahan skema database di MS SQL Server. Seperti biasa, saya akan senang mendengar solusi alternatif apa pun.

Solusi

  1. Buat dua tabel:yang pertama untuk setiap database, yang kedua – untuk semua database:
    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. Buat pemicu DDL untuk database yang mengumpulkan perubahan skema:
    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

Saya sarankan menyesuaikan filter dan tidak membuat pemicu DDL untuk seluruh server. Tidak ada gunanya, karena Anda akan mendapatkan banyak informasi yang tidak perlu. Dalam hal ini, lebih baik membuat pemicu untuk setiap database.
Namun, Anda harus mematikan pemicu ini selama operasi yang rumit, misalnya, replikasi. Namun nanti, Anda dapat mengaktifkannya kembali.

  1. Anda perlu mengumpulkan informasi dalam satu tabel. Misalnya, Anda dapat melakukannya dengan tugas di SQL Server Agent satu kali seminggu.
  2. Anda dapat mengumpulkan semuanya dalam satu tabel dengan cara lain yang Anda inginkan.

Selain itu, saya sarankan untuk menghapus data lama.

Hasil

Pada artikel ini, saya telah menganalisis contoh penerapan pengumpulan data otomatis tentang perubahan skema database di MS SQL Server. Ini memungkinkan kita untuk mengetahui apa dan kapan telah dimodifikasi, dan, jika perlu, untuk mengembalikannya. Secara umum, solusi ini mungkin berguna pada tahap implementasi di mana ada banyak kesalahan dan ketika kita memiliki versi salinan database yang berbeda untuk dianalisis. Jika Anda ingin mengetahui alasan perubahan, Anda dapat melakukannya dengan mengambil riwayat revisi.

Baca juga:

Pengumpulan Data Otomatis tentang Tugas yang Diselesaikan di MS SQL Server


  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 Server String atau data biner akan terpotong

  2. Gabungkan banyak baris menjadi satu string teks dengan pengelompokan

  3. Menyimpan dan Menganalisis Dokumen di Sistem File Windows dengan Pencarian Semantik SQL Server – Bagian 2

  4. Pemicu SQL Server:Pemahaman dan Alternatif

  5. Query Profiling 101 — Ya, Itu Benar-Benar Dapat Meningkatkan Kinerja SQL Server Anda