Dada uma tabela da forma...
create table dbo.FilterIDXTest (
id int not null identity primary key clustered,
_bigint bigint,
_varchar10 varchar(10),
_varchar20 varchar(20),
_guid uniqueidentifier
);
go
create unique index uq_FilterIDXTest
on dbo.FilterIDXTest ( _varchar10, _varchar20 )
include ( _guid )
where _bigint is not null
and id > 5;
go
... em que (se houver) exibição de catálogo (ou outro objeto de referência bem formado) os nomes das colunas na WHERE
cláusula podem ser localizados e rigorosamente identificados?
sys.indexes
pode ser visualizado para nos lembrar que o filter_definition
é ([_bigint] IS NOT NULL AND [id]>(5))
.
sys.index_columns
pode ser visualizado para nos informar as colunas ON
e INCLUDE
, mas lista apenas 3 das 5 colunas no CREATE INDEX
comando original. As filter_predicate
colunas não são encontradas aqui.
Devo assumir que as filter_predicate
dependências são rigorosamente verificadas em algum estágio porque sp_rename 'dbo.FilterIDXTest._bigint', 'foo_bigint', 'column'
falha com o erro ...
Caution: Changing any part of an object name could break scripts and stored procedures.
Msg 5074, Level 16, State 1, Procedure sp_rename, Line 611
The index 'uq_FilterIDXTest' is dependent on column '_bigint'.
Msg 4922, Level 16, State 9, Procedure sp_rename, Line 611
RENAME COLUMN _bigint failed because one or more objects access this column.
... e não consigo acreditar que a única razão pela qual isso falha é por causa de alguma correspondência de texto em sys.indexes.filter_definition
.
Para referência, a tarefa em questão é extrair o código-fonte de vários servidores legados não documentados. Minha solicitação para usar o RedGate/algum outro aplicativo auxiliar pago para essa finalidade já foi rejeitada, pois " Você pode apenas criar o script dos objetos da interface do usuário, certo? ". Talvez eu tenha sido excessivamente rigoroso, mas gostaria de ter um nível muito alto de confiança de que o índice que estou verificando no controle de origem é o índice que realmente existe. Estou testando este script no sql server 2012 , mas os servidores de destino nos quais ele será executado variam de 2005 SP1 a 2008 R2 SP3 .
Acho que essas informações estão armazenadas em
sys.sql_expression_dependencies
. Consulte a tabela no MSDN,sys.sql_expression_dependencies
:Observe também que os índices filtrados foram adicionados como um recurso na versão 2008 e essa visualização do sistema não existe em 2005 (obrigado a @Michael Eriksson por observar isso).