-
-
Partendo da qui, ovvero dalla possibilità di poter creare degli indici identici, mi sono divertito nel costruire uno strumento che sia in grado di segnalare un warning in maniera automatica.
Grazie ai Trigger DDL la cosa diventa molto semplice…
use tempdb
go
IF EXISTS (SELECT 1 FROM sys.triggers WHERE parent_class_desc = 'DATABASE'
AND name = N'tr_verifyIndexEsists')
BEGIN
DISABLE TRIGGER [tr_verifyIndexEsists] ON DATABASE
DROP TRIGGER [tr_verifyIndexEsists] ON DATABASE
END
GO
create trigger tr_verifyIndexEsists
on database
for create_index, alter_index, alter_table
as
begin
/*
Il trigger scatta per eventi:
- create index
- alter index
- alter table (per coprire l'aggiunta di constraint come lo UNIQUE)
*/
declare @message varchar(4000) = ''
;WITH tIndex AS
(
SELECT
object_id AS id ,
index_id AS indid ,
type,
name,
(
SELECT colid as colPosition
FROM sys.sysindexkeys
WHERE id = I.object_id AND indid = I.index_id AND keyno > 0
FOR XML PATH
) AS cols ,
(
SELECT includedCol FROM
(
SELECT CASE keyno WHEN 0 THEN colid ELSE NULL END AS includedCol
FROM sys.sysindexkeys
WHERE id = I.object_id AND indid = I.index_id
) T0
order by includedCol
FOR XML PATH
) AS inc
FROM sys.indexes AS I
)
SELECT @message = @message
+ ' * Table: ' + tableName + ' * '
+ 'Duplicate index: ' + indexName + CHAR(13) + CHAR(10)
FROM
(
SELECT DISTINCT
object_schema_name ( T1.id ) + '.' + object_name ( T1.id ) tableName,
T2.name as indexName
FROM tIndex AS T1
JOIN tIndex AS T2 ON
T1.type = T2.type AND
T1.id = T2.id AND
T1.indid < T2.indid AND
T1.cols = T2.cols AND
T1.inc = T2.inc
) T0
if (@message != '')
begin
print 'WARNING: duplicate index!'
print @message
end
end
go
Un esempio:
use tempdb
go
create table test
(
colonna varchar(10)
)
go
alter table test add constraint u1 unique (colonna)
alter table test add constraint u2 unique (colonna)
alter table test add constraint u3 unique (colonna)
alter table test add constraint u4 unique (colonna)
drop table test
go
Ecco cosa ottengo:

-
-
Solo una parola: fantastico!
E meno male che si tratta di un rinomatissimo gruppo bancario nostrano.
Forse i db saranno a nanna?
O forse hanno fermato i servizi per copiare i files (almeno spero su un altro disco… :-))