giugno 2009 - Posts

Ancora sugli indici duplicati. Un warning grazie ai Trigger DDL
11 giugno 09 12.10 | abenedetti | with no comments

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:

image

Filed under: ,
Eh… quando si dice alta disponibilità…
04 giugno 09 10.46 | abenedetti | 4 comment(s)

Solo una parola: fantastico!

image

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… :-))

Filed under:

This Blog

Syndication