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

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЯреЗрдмрд▓ рдмрдирд╛рдПрдВ рдЬрд┐рд╕рдореЗрдВ рд╕рдВрд╕реНрдХрд░рдг рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗ
USE master GO
рд▓реМрдХрд┐рдХ рддрд╛рд▓рд┐рдХрд╛ рдХреА рд╕реАрдорд╛рдУрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ
ред- рдЙрдиреНрд╣реЗрдВ рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рдбреАрдбреАрдПрд▓ рдХрдорд╛рдВрдб рдХреЛ рдореБрдЦреНрдп рдпрд╛ рдРрддрд┐рд╣рд╛рд╕рд┐рдХ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдкрд░ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рдФрд░ рдЖрдк рдЯреЗрдореНрдкреЛрд░рд▓ рдЯреЗрдмрд▓ рдХреЛ рд╣рдЯрд╛ рдирд╣реАрдВ рд╕рдХрддреЗ рд╣реИрдВ
- рдЖрдк рдРрддрд┐рд╣рд╛рд╕рд┐рдХ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдбреЗрдЯрд╛ рдирд╣реАрдВ рдмрджрд▓ рд╕рдХрддреЗ
рджреВрд╕рд░рд╛ рдкреНрд░рддрд┐рдмрдВрдз рд╣рдореЗрдВ рд╕реВрдЯ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ?
рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:
рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЕрднреА рддрдХ рдореЗрдЬ рдкрд░ рдХреЛрдИ рдЕрдиреБрдХреНрд░рдорд┐рдд рдирд╣реАрдВ рд╣реИрдВ, рдЗрд╕реЗ рд╣рдорд╛рд░реА рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ, рдХрд╛рд░реНрдпреЛрдВ, рдЖрджрд┐ рдХреЗ рд╕рд╛рде рднрд░реЗрдВ, рдЬреЛ рдХрд┐
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
рдФрд░ рдЗрд╕ рдкреНрд░рдгрд╛рд▓реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП, рдиреАрдЪреЗ рджреА рдЧрдИ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╣реИред
рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ рдЙрдкрд╕рд░реНрдЧ
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
рдиреАрдЪреЗ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ
рдЖрдк рдЗрд╕ рдорд╛рдЗрдХреНрд░реЛрдлрд╝реНрд░рд╛рдорд╡рд░реНрдХ рдХреЛ рдореЗрд░реЗ
рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╕реЗ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдпрджрд┐ рдЖрдкрдХрд╛ SQL SQL рд╕рдВрд╕реНрдХрд░рдг 2016 рд╕реЗ рдЫреЛрдЯрд╛ рд╣реИ, рддреЛ
рдпрд╣рд╛рдВ рдЖрдк
рд╣реИрдВ ред рд╡реИрд╕реЗ, рд╣рдо рдЕрднреА рдЗрд╕ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдЗрддрдирд╛ рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИред
рдирд┐рд╖реНрдХрд░реНрд╖ рдореЗрдВ
рдореИрдВ рдХрднреА рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рдирд╣реАрдВ рд╣реБрдЖ
& _gt; рдФрд░
& _lt; Sql рдлрд╝реАрд▓реНрдб рджреНрд╡рд╛рд░рд╛
Master.dbo.VersionControl рддрд╛рд▓рд┐рдХрд╛ рд╕реЗ рд╕рдВрдХреЗрддреЛрдВ рдХреЗ рдмрдЬрд╛рдп
> рдФрд░
< ред рдпрджрд┐ рдЖрдк рдЗрд╕рдореЗрдВ рд╕рд╣рд╛рдпрддрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдХреЛрдИ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдореИрдВ рдПрдХ
рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред
рдЕрдкрдиреЗ рд╕рдордп рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рд╕рд┐рддрд╛рд░реЛрдВ, рджрд┐рд▓реЛрдВ рдФрд░ рдКрдкрд░ рддреАрд░реЛрдВ рдХреЛ рд░рдЦреЛред