Eu tenho algo parecido com isto:
CREATE TABLE T1 (
Id INT
...
,Constraint [PK_T1] PRIMARY KEY CLUSTERED [Id]
)
CREATE TABLE T2 (
....
,T1_Id INT NOT NULL
,CONSTRAINT [FK_T2_T1] FOREIGN KEY (T1_Id) REFERENCES T1(Id)
)
Por motivos de desempenho (e deadlock), criei um novo índice no T1
CREATE UNIQUE NONCLUSTERED INDEX IX_T1_Id ON T1 (Id)
Mas se eu verificar para qual índice faz referência ao FK, continuarei fazendo referência ao índice em cluster
select
ix.index_id,
ix.name as index_name,
ix.type_desc as index_type_desc,
fk.name as fk_name
from sys.indexes ix
left join sys.foreign_keys fk on
fk.referenced_object_id = ix.object_id
and fk.key_index_id = ix.index_id
and fk.parent_object_id = object_id('T2')
where ix.object_id = object_id('T1');
Se eu largar a restrição e criar novamente, ela fará referência ao índice não clusterizado, mas isso levará a verificar todos os T2 FK novamente.
Existe uma maneira de mudar isso para que o FK_T2_T1 use IX_T1_Id em vez de PK_T1 sem soltar o FK e bloquear a tabela na verificação do FK?
Obrigado!
sql-server
sql-server-2014
foreign-key
Mariano G
fonte
fonte
Respostas:
Bem, depois de continuar pesquisando, encontrei este artigo
Portanto, a menos que alguém possa dizer o contrário, terei que procurar uma janela de tempo para executar esta tarefa.
obrigado
fonte
Depois de ler o MS DOCS aqui .
No seu caso, acredito que adicione um novo FK e exclua o antigo. Para desativar a verificação, você pode usar a
NO CHECK
opçãoVeja se isso funciona, o que estou tentando é adicionar mais um FK para que o novo esteja vinculado ao novo índice criado e solte o antigo FK. Eu sei que a pergunta é não largar a existente, mas ver se esta opção irá ajudá-lo.
Além disso, conforme os comentários de Max Vernon: "a opção WITH NOCHECK impedirá que a chave estrangeira seja confiável pelo otimizador. Em algum momento, você precisará alterar a chave estrangeira para que seja confiável usando ALTER TABLE ... COM VERIFICAÇÃO "
A
NOCHECK
única será ignorado no momento da criação, mas para impor a integridade contraint você executar este em algum ponto do tempo.fonte
WITH NOCHECK
opção impedirá que a chave estrangeira seja confiável pelo otimizador. Em algum momento, você teria que alterar a chave estrangeira para que ela seja confiável usando o #ALTER TABLE ... WITH CHECK