SQL_scripts
/
сравнение определений объектов.sql
232 строки · 7.5 Кб
1create or alter procedure [dbo].[Comparison_of_definitions]
2@left_srv varchar(30) -- левый сервер
3,@right_srv varchar(30) -- правый сервер
4,@left_db varchar(30) -- левая база
5,@right_db varchar(30) -- правая база
6,@types varchar(30) -- KI=индексы, остальные типы это колонка type из sys.objects
7,@show_defin bit = 0 -- итоговый вывод с определения
8,@only_different bit = 0 -- в итоговом выводе только разчающиеся
9as
10set nocount on
11
12declare
13@query nvarchar(max)
14,@db varchar(30)
15,@link varchar(30)
16,@l_srv_name varchar(30)
17,@r_srv_name varchar(30)
18,@srv_name varchar(30)
19
20-- таблица маппинга линков и серверов
21select @l_srv_name = [name]
22from
23where [data_source] = @left_srv
24
25select @r_srv_name = [name]
26from
27where [data_source] = @right_srv
28
29
30if (@l_srv_name = @r_srv_name and @right_db = @left_db)
31throw 50000, 'Одинаковые имена серверов и баз данных', 1
32
33drop table if exists #R_result
34drop table if exists #L_result
35
36create table #R_result (
37srv varchar(30)
38,db varchar(30)
39,shm varchar(30)
40,obj varchar(200)
41,tp varchar(30)
42,crdt datetime
43,mfdt datetime
44,def varchar(max)
45,chksum as checksum(upper(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(replace(replace(replace( SUBSTRING (def, CHARINDEX (obj, def), LEN(def)),char(32),''),char(9),''),char(10),''),char(13),''),'dbo',''),'].[',''),'[',''),']',''))) persisted
46,flnm as upper(concat(shm,'.',obj)) persisted
47)
48create table #L_result (
49srv varchar(30)
50,db varchar(30)
51,shm varchar(30)
52,obj varchar(200)
53,tp varchar(30)
54,crdt datetime
55,mfdt datetime
56,def varchar(max)
57,chksum as checksum(upper(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(replace(replace(replace( SUBSTRING (def, CHARINDEX (obj, def), LEN(def)),char(32),''),char(9),''),char(10),''),char(13),''),'dbo',''),'].[',''),'[',''),']',''))) persisted
58,flnm as upper(concat(shm,'.',obj)) persisted
59)
60
61select
62@db = @right_db
63,@link = @right_srv
64,@srv_name = @r_srv_name
65
66begin try
67
68while (1=1)
69begin
70set @query = '
71use '+quotename(@db)+'
72
73' + iif(charindex('KI', @types) = 0, '', '
74select
75s.[schema name] as sch_name
76,s.[table name] + ''''.'''' + s.[index name] as obj_name
77,iif(s.[is primary key] | s.[is unique constraint] = 1,
78''''alter table '''' + s.[schema name] + ''''.'''' + s.[table name] + '''' add constraint '''' + s.[index name] + iif(s.[is primary key] = 1, '''' primary key '''', '''' unique '''') + s.[index type] + '''' ( '''' + s.[key column names] + '''' ) '''',
79''''create '''' + iif(s.[is unique] = 1,'''' unique '''', '''''''') + s.[index type] + '''' index '''' + s.[index name] + '''' on '''' + s.[schema name] + ''''.'''' + s.[table name] + '''' ( '''' + s.[key column names] + '''' ) ''''
80+ iif(s.[included column names] = '''''''', '''''''', concat('''' include ('''',s.[included column names],'''') ''''))
81+ iif(s.[has filter] = 1,'''' where '''' + s.[filter definition],'''''''')) as obj_def
82,create_date
83,modify_date
84,cast(case when s.[is primary key] = 1 then ''''PK'''' when s.[is unique constraint] = 1 then ''''UQ'''' else ''''IDX'''' end as char(2)) collate Latin1_General_CI_AS_KS_WS as obj_type
85into #ki
86from (
87select
88quotename(o.[name]) as [table name]
89,quotename(s.[name]) as [schema name]
90,quotename(i.[name]) as [index name]
91,stuff(ic.[key].value(''''/x[1]'''',''''nvarchar(max)''''),1,1,'''''''') collate Latin1_General_CI_AS_KS_WS as [key column names]
92,isnull(stuff(ic2.[incl].value(''''/x[1]'''',''''nvarchar(max)''''),1,1,''''''''),'''''''') collate Latin1_General_CI_AS_KS_WS as [included column names]
93,lower(i.[type_desc]) as [index type]
94,i.is_unique as [is unique]
95,i.has_filter as [has filter]
96,isnull(i.filter_definition,'''''''') as [filter definition]
97,i.is_primary_key as [is primary key]
98,i.is_unique_constraint as [is unique constraint]
99,o.create_date
100,o.modify_date
101from
102sys.indexes as i (nolock)
103inner join sys.objects as o (nolock)
104on i.object_id = o.object_id
105and o.is_ms_shipped = 0
106inner join sys.schemas as s (nolock)
107on s.schema_id = o.schema_id
108cross apply (
109select '''','''' + quotename(c.[name]) + iif(ic.is_descending_key = 0, '''' asc'''', '''' desc'''')
110from
111sys.index_columns as ic (nolock)
112inner join sys.columns as c (nolock)
113on c.object_id = ic.object_id
114and ic.column_id = c.column_id
115where
116ic.object_id = i.object_id
117and ic.index_id = i.index_id
118and ic.is_included_column = 0
119order by ic.key_ordinal
120for xml path(''''''''),root(''''x''''),type
121) ic([key])
122outer apply (
123select '''','''' + quotename(c.[name])
124from
125sys.index_columns as ic (nolock)
126inner join sys.columns as c (nolock)
127on c.object_id = ic.object_id
128and ic.column_id = c.column_id
129where
130ic.object_id = i.object_id
131and ic.index_id = i.index_id
132and ic.is_included_column = 1
133order by ic.key_ordinal
134for xml path(''''''''),root(''''x''''),type
135) ic2(incl)
136where i.[type_desc] <> ''''heap''''
137) as s') + '
138
139;with s as (
140select
141s.name as sch_name
142,o.name as obj_name
143,o.type
144,o.create_date
145,o.modify_date
146,object_definition(o.object_id) as obj_def
147from
148sys.objects as o (nolock)
149inner join sys.schemas as s (nolock)
150on s.schema_id = o.schema_id
151inner join string_split('''''+replace(@types,',','')+''''','''';'''') as ss
152on o.type = ss.value
153' + iif(charindex('KI', @types) = 0, '', '
154union all
155select
156sch_name
157,obj_name
158,obj_type
159,create_date
160,modify_date
161,obj_def
162from #ki
163')+ ')
164select
165'''''+@srv_name+'''''
166,'''''+@db+'''''
167,sch_name
168,obj_name
169,type
170,create_date
171,modify_date
172,rtrim(ltrim(isnull(obj_def,''''НЕТ ОПРЕДЕЛЕНИЯ (возможно проблема с правами или линком)''''))) as def
173from s
174'
175
176set @query = 'exec ('''+@query+''') at '+quotename(@link)
177
178if (@link = @right_srv)
179insert into #R_result (srv,db,shm,obj,tp,crdt,mfdt,def)
180exec @query
181else
182begin
183insert into #L_result (srv,db,shm,obj,tp,crdt,mfdt,def)
184exec @query
185
186break
187end
188
189select @db = @left_db, @link = @left_srv, @srv_name = @l_srv_name
190end
191end try
192begin catch
193select error_message()
194throw;
195
196end catch
197
198;with cte as (
199select
200format(t.mfdt,'dd.MM.yyyy HH:mm') as ldtmf
201,t.obj as lobj
202,isnull(t.tp,t2.tp) as tp
203,isnull(t.shm,t2.shm) as shm
204,t2.obj as robj
205,format(t2.mfdt,'dd.MM.yyyy HH:mm') as rdtmf
206,iif(@show_defin=0,'', case
207when t.flnm = t2.flnm and t.tp = t2.tp and t.chksum = t2.chksum
208then t.def
209when t.flnm = t2.flnm and t.tp = t2.tp and t.chksum <> t2.chksum
210then concat('ЛЕВОЕ:',char(13)+char(10),t.def,char(10)+char(13),'ПРАВОЕ:',char(13)+char(10),t2.def)
211else isnull(t.def,t2.def) end) as def
212,t.def as l_def
213,t2.def as r_def
214,case when t.flnm = t2.flnm and t.tp = t2.tp and t.chksum = t2.chksum then 1
215when t.flnm = t2.flnm and t.tp = t2.tp and t.chksum <> t2.chksum then 2
216else 3 end as dif
217from
218#L_result as t
219full join #R_result as t2
220on t.flnm = t2.flnm
221and t.tp = t2.tp
222--and t.chksum = t2.chksum
223)
224select *
225from cte
226where (@only_different = 0 or dif > 1)
227order by row_number() over(order by (case when lobj is not null and robj is not null then 1
228when lobj is not null and robj is null then 2
229else 3 end), tp, shm, lobj, robj)
230
231
232go
233
234