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
- 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
- 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.
- Anda perlu mengumpulkan informasi dalam satu tabel. Misalnya, Anda dapat melakukannya dengan tugas di SQL Server Agent satu kali seminggu.
- 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