SQL рд╕рд░реНрд╡рд░ рдХреЗ рдЕрдВрджрд░ рд╕рдВрд╕реНрдХрд░рдг рдирд┐рдпрдВрддреНрд░рдг

рдЬреВрд▓рд┐рдпрд╛ : рддреЛ, рдХрд▓ рдореЗрд░реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд┐рд╕рдиреЗ рдмрджрд▓реА?
рд▓рд╢рд╛ : рдореБрдЭреЗ рдирд╣реАрдВ
рдореИрдХреНрд╕рд┐рдо : рдореБрдЭреЗ рдирд╣реАрдВ
- рджреЛрд╕реНрддреЛрдВ, рдХреНрдпрд╛ рд╣рдо Git рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?
Seryozha : рдпрд╣ рдЙрдЪреНрдЪ рд╕рдордп рд╣реИ!
2 рд╕рдкреНрддрд╛рд╣ рдмреАрдд рдЪреБрдХреЗ рд╣реИрдВ ...

рдЬреВрд▓рд┐рдпрд╛ : рджреЛрд╕реНрддреЛрдВ?
- рдпреБрд▓, рдХреНрдпрд╛ рддреБрдордиреЗ рдирд╣реАрдВ рдХрд┐рдпрд╛?
рдЬреВрд▓рд┐рдпрд╛ : рдЕрд░реЗ рдирд╣реАрдВ (...

рдЗрд╕ рддрд░рд╣ рдпрд╣ рд╕рдм рд╢реБрд░реВ рд╣реБрдЖред рдЦреИрд░, рдХреНрдпрд╛, рдкреНрд░рддреНрдпреЗрдХ рдЪрд░рд┐рддреНрд░ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдкрдВрдХреНрддрд┐ рдкреНрд░рддрд┐рдмрджреНрдз рд╣реИ?

рдпрд╛ рд╢рд╛рдпрдж рдпрд╣ рд╕рдм рдЕрдкрдиреЗ рдЖрдк рд╣реЛ рдЬрд╛рдПрдЧрд╛?) рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░, рдЙрдирдХреЗ рджрд┐рдорд╛рдЧ рдореЗрдВ рдЖрдирд╛ рд╢реБрд░реВ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ
рдбреАрдбреАрдПрд▓ рдЯреНрд░рд┐рдЧрд░реНрд╕ , рдЯреЗрдореНрдкреЛрд░рд▓ рдЯреЗрдмрд▓ рдФрд░ рдЪрд┐рддреНрд░ рдЬреЛрдбрд╝реЗ рдЬрд╛рддреЗ рд╣реИрдВред рд╣рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛, рд╣рдо рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЛ рдЕрдВрджрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдВрдЧреЗ
SQL Server'a !)




рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЯреЗрдмрд▓ рдмрдирд╛рдПрдВ рдЬрд┐рд╕рдореЗрдВ рд╕рдВрд╕реНрдХрд░рдг рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗ

USE master GO --     IF NOT EXISTS ( SELECT 1 FROM sys.objects WHERE name = 'VersionControlHistory' AND type = 'U' ) CREATE TABLE dbo.VersionControlHistory( Id INT NOT NULL, Event sysname NOT NULL, Db sysname NOT NULL, Sch sysname NOT NULL, Object sysname NOT NULL, Sql XML NOT NULL, Login sysname NOT NULL, StartDate DATETIME2(0) NOT NULL, EndDate DATETIME2(0) NOT NULL ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] GO --      IF NOT EXISTS ( SELECT 1 FROM sys.objects WHERE name = 'VersionControl' AND type = 'U' ) CREATE TABLE dbo.VersionControl( Id INT IDENTITY(1,1) NOT NULL CONSTRAINT PK_VersionControl PRIMARY KEY NONCLUSTERED, Event sysname NOT NULL, Db sysname NOT NULL, Sch sysname NOT NULL, Object sysname NOT NULL, Sql XML NOT NULL, Login sysname NOT NULL, StartDate DATETIME2(0) GENERATED ALWAYS AS ROW START NOT NULL, EndDate DATETIME2(0) GENERATED ALWAYS AS ROW END NOT NULL, PERIOD FOR SYSTEM_TIME (StartDate, EndDate) ) WITH ( SYSTEM_VERSIONING = ON ( HISTORY_TABLE = dbo.VersionControlHistory ) ) GO 

рд▓реМрдХрд┐рдХ рддрд╛рд▓рд┐рдХрд╛ рдХреА рд╕реАрдорд╛рдУрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ ред

  1. рдЙрдиреНрд╣реЗрдВ рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рдбреАрдбреАрдПрд▓ рдХрдорд╛рдВрдб рдХреЛ рдореБрдЦреНрдп рдпрд╛ рдРрддрд┐рд╣рд╛рд╕рд┐рдХ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдкрд░ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рдФрд░ рдЖрдк рдЯреЗрдореНрдкреЛрд░рд▓ рдЯреЗрдмрд▓ рдХреЛ рд╣рдЯрд╛ рдирд╣реАрдВ рд╕рдХрддреЗ рд╣реИрдВ
  2. рдЖрдк рдРрддрд┐рд╣рд╛рд╕рд┐рдХ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдбреЗрдЯрд╛ рдирд╣реАрдВ рдмрджрд▓ рд╕рдХрддреЗ

рджреВрд╕рд░рд╛ рдкреНрд░рддрд┐рдмрдВрдз рд╣рдореЗрдВ рд╕реВрдЯ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ?

рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:

 --        ALTER TABLE dbo.VersionControl SET ( SYSTEM_VERSIONING = OFF ); /* -  */ --    : ALTER TABLE dbo.VersionControl SET ( SYSTEM_VERSIONING = ON ( HISTORY_TABLE = dbo.VersionControlHistory, DATA_CONSISTENCY_CHECK = OFF ); 

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЕрднреА рддрдХ рдореЗрдЬ рдкрд░ рдХреЛрдИ рдЕрдиреБрдХреНрд░рдорд┐рдд рдирд╣реАрдВ рд╣реИрдВ, рдЗрд╕реЗ рд╣рдорд╛рд░реА рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ, рдХрд╛рд░реНрдпреЛрдВ, рдЖрджрд┐ рдХреЗ рд╕рд╛рде рднрд░реЗрдВ, рдЬреЛ рдХрд┐ INIT рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рд╣реИрдВ, рдЬреЛ рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╕реНрдерд╛рди рд╣реЛрдЧрд╛ред

 DECLARE @query NVARCHAR(MAX), @template NVARCHAR(MAX) = N' USE [db] INSERT INTO MASTER.dbo.VersionControl WITH (TABLOCKX) ( Event, Db, Sch, Object, Sql, Login ) SELECT ''INIT'' AS Event, DB_NAME(), ss.name AS Sch, so.name AS Object, CONCAT(''<query><![CDATA['', sasm.definition, '']]></query>'' ), SUSER_SNAME() AS Login FROM sys.objects AS so JOIN sys.schemas AS ss ON ss.schema_id = so.schema_id JOIN sys.all_sql_modules AS sasm ON sasm.object_id = so.object_id WHERE so.is_ms_shipped = 0 AND NOT EXISTS ( SELECT 1 FROM MASTER.dbo.VersionControl AS vc WHERE vc.Db = ''[db]'' AND vc.Sch = ss.name AND vc.Object = so.name ); '; DECLARE @databases TABLE (rn INT, Name sysname); INSERT @databases (rn, Name) SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS rn, name FROM sys.databases WHERE owner_sid != 0x01; DECLARE @i INT = 1, @max INT = (SELECT MAX(rn) FROM @databases), @error NVARCHAR(128), @db sysname; WHILE @i < @max BEGIN SELECT @query = REPLACE(@template, '[db]', Name), @db = Name FROM @databases WHERE rn = @i; BEGIN TRY EXECUTE sp_executesql @query; SET @i += 1; CONTINUE; END TRY BEGIN CATCH SET @error = CONCAT( 'XML Parsing error. In this case that''s mean one of [', @db, '] object is invalid for convert to XML' ); PRINT @error; SET @i += 1; CONTINUE; END CATCH; END; GO 

рдХреНрдпреЛрдВрдХрд┐ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди UPDATE рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреЗ рд╕рд╛рде рд╣реЛрдВрдЧреЗ, рдФрд░ рд╣рдо рдЕрдХреНрд╕рд░ рдХреБрдВрдЬреА рджреНрд╡рд╛рд░рд╛ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЛ рджреЗрдЦреЗрдВрдЧреЗ: рдбреЗрдЯрд╛рдмреЗрд╕, рд╕реНрдХреАрдорд╛ рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдирд╛рдо, рдЗрдВрдбреЗрдХреНрд╕!

 IF NOT EXISTS ( SELECT 1 FROM sys.indexes WHERE name = 'IX_VersionControl_upd_key' ) CREATE UNIQUE NONCLUSTERED INDEX IX_VersionControl_upd_key ON MASTER.dbo.VersionControl (Db, Sch, Object) INCLUDE (Sql, Event, Login); 

рд╕рдВрд╕реНрдХрд░рдг рд╕рдВрдЧреНрд░рд╣ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдм рдХреБрдЫ рддреИрдпрд╛рд░ рд╣реИ рдФрд░ рдЗрд╕ рдбреАрдбреАрдПрд▓ рдЯреНрд░рд┐рдЧрд░ рдХреЗ рд╕рд╛рде рд╣рдорд╛рд░реА рдорджрдж рдХрд░реЗрдЧрд╛

рдорд╣рддреНрд╡рдкреВрд░реНрдг! рдХреНрдпреЛрдВрдХрд┐ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдЯреЗрдмрд▓ рдорд╛рд╕реНрдЯрд░ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд╣реИрдВ, рдПрдХ рдЯреНрд░рд┐рдЧрд░ рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдЬрд┐рди рд▓реЛрдЧреЛрдВ рдХреЗ рдкрд╛рд╕ рдЗрд╕ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рдЕрдзрд┐рдХрд╛рд░ рдирд╣реАрдВ рд╣реИрдВ, рд╡реЗ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд, рдмрдирд╛ рдпрд╛ рд╣рдЯрд╛ рдирд╣реАрдВ рд╕рдХрддреЗ рд╣реИрдВ

 IF EXISTS ( SELECT 1 FROM sys.server_triggers WHERE name = 'tr_VersionControl' ) DROP TRIGGER tr_VersionControl ON ALL SERVER GO CREATE TRIGGER tr_VersionControl ON ALL SERVER --WITH ENCRYPTION --   /*      : https://docs.microsoft.com/ru-ru/sql/relational-databases/triggers/ddl-events?view=sql-server-2017 */ FOR CREATE_TABLE, ALTER_TABLE, DROP_TABLE, CREATE_VIEW, ALTER_VIEW, DROP_VIEW, CREATE_FUNCTION, ALTER_FUNCTION, DROP_FUNCTION, CREATE_PROCEDURE, ALTER_PROCEDURE, DROP_PROCEDURE, CREATE_ASSEMBLY, ALTER_ASSEMBLY, DROP_ASSEMBLY, CREATE_INDEX, ALTER_INDEX, DROP_INDEX, CREATE_TRIGGER, ALTER_TRIGGER, DROP_TRIGGER, RENAME AS BEGIN SET NOCOUNT ON; UPDATE vs SET vs.Event = ev.EventType, vs.Sql = CONCAT('<query><!CDATA', ev.Sql, '></query>' ), vs.Login = ev.Login FROM MASTER.dbo.VersionControl AS vs JOIN ( SELECT * FROM ( VALUES ( EVENTDATA().value( '(/EVENT_INSTANCE/EventType)[1]', 'NVARCHAR(128)' ), EVENTDATA().value( '(/EVENT_INSTANCE/SchemaName)[1]', 'NVARCHAR(128)' ), EVENTDATA().value( '(/EVENT_INSTANCE/ObjectName)[1]', 'NVARCHAR(128)' ), EVENTDATA().value( '(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]', 'NVARCHAR(MAX)' ), EVENTDATA().value( '(/EVENT_INSTANCE/LoginName)[1]', 'NVARCHAR(128)' ) )) AS Event (EventType, Sch, Object, Sql, Login ) ) ev ON vs.Db = DB_NAME() AND vs.Sch = ev.Sch AND vs.Object = ev.Object ; END GO 

рдФрд░ рдЗрд╕ рдкреНрд░рдгрд╛рд▓реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП, рдиреАрдЪреЗ рджреА рдЧрдИ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╣реИред

рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ рдЙрдкрд╕рд░реНрдЧ sp_ рдбреЗрдЯрд╛рдмреЗрд╕ рдФрд░ рд╕реНрдХреАрдорд╛ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдП рдмрд┐рдирд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╣рдорд╛рд░реА рд╕рд╣рд╛рдпрддрд╛ рдХрд░реЗрдЧрд╛ред рдкреИрд░рд╛рдореАрдЯрд░реНрд╕ рдХреЛ рд╕рд╣рдЬ рд░реВрдк рд╕реЗ рднрд░рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдк рдХреЗрд╡рд▓ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╣рдо рдкреВрд░реЗ рд╕рдордп рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдЗрд╕рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝реА рд╣реБрдИ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рджреЗрдЦреЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдЖрдк рдЗрд╕ рдпреЛрдЬрдирд╛, рд╕реНрд╡рдпрдВ рд╡рд╕реНрддреБ рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЙрд╕ рд╕рдордп рд╕реАрдорд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдкрд░рд┐рд╡рд░реНрддрди рдХрд┐рдП рдЧрдП рдереЗред

 CREATE PROCEDURE dbo.sp_Vc @db sysname = '%', @sch sysname = '%', @obj sysname = '%', @from DATETIME2(0) = NULL, @to DATETIME2(0) = NULL AS BEGIN SET NOCOUNT ON; IF @from IS NULL AND @to IS NULL BEGIN SELECT * FROM master.dbo.VersionControl WHERE Db LIKE @db AND Sch LIKE @sch AND Object LIKE @obj ORDER BY StartDate DESC END ELSE BEGIN SELECT * FROM master.dbo.VersionControl FOR SYSTEM_TIME BETWEEN @from AND @to WHERE Db LIKE @db AND Sch LIKE @sch AND Object LIKE @obj ORDER BY StartDate DESC END END GO 

рдиреАрдЪреЗ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ

 --        sp_Vc; /*          */ sp_Vc 'dwh'; /*            */ sp_Vc 'dwh', 'dbo'; /*      ,        */ sp_Vc 'dwh', 'dbo', 'MyObject'; /*      , ,       1-  9-  */ sp_Vc 'dwh', 'dbo', 'MyObject', '20180501 00:00:00', '20180509 00:00:00'; 

рдЖрдк рдЗрд╕ рдорд╛рдЗрдХреНрд░реЛрдлрд╝реНрд░рд╛рдорд╡рд░реНрдХ рдХреЛ рдореЗрд░реЗ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╕реЗ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдпрджрд┐ рдЖрдкрдХрд╛ SQL SQL рд╕рдВрд╕реНрдХрд░рдг 2016 рд╕реЗ рдЫреЛрдЯрд╛ рд╣реИ, рддреЛ рдпрд╣рд╛рдВ рдЖрдк рд╣реИрдВ ред рд╡реИрд╕реЗ, рд╣рдо рдЕрднреА рдЗрд╕ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдЗрддрдирд╛ рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИред

рдирд┐рд╖реНрдХрд░реНрд╖ рдореЗрдВ


рдореИрдВ рдХрднреА рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рдирд╣реАрдВ рд╣реБрдЖ & _gt; рдФрд░ & _lt; Sql рдлрд╝реАрд▓реНрдб рджреНрд╡рд╛рд░рд╛ Master.dbo.VersionControl рддрд╛рд▓рд┐рдХрд╛ рд╕реЗ рд╕рдВрдХреЗрддреЛрдВ рдХреЗ рдмрдЬрд╛рдп > рдФрд░ < ред рдпрджрд┐ рдЖрдк рдЗрд╕рдореЗрдВ рд╕рд╣рд╛рдпрддрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдХреЛрдИ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдореИрдВ рдПрдХ рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред

рдЕрдкрдиреЗ рд╕рдордп рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рд╕рд┐рддрд╛рд░реЛрдВ, рджрд┐рд▓реЛрдВ рдФрд░ рдКрдкрд░ рддреАрд░реЛрдВ рдХреЛ рд░рдЦреЛред

Source: https://habr.com/ru/post/hi419919/


All Articles