Eu tenho usado o seguinte padrão para validar parâmetros FOREIGN KEY (FK) para procedimentos armazenados que executam INSERTs:
CREATE PROC spCreateChildFoo
@ForeignKey_Id int,
@Attribute varchar(50)
AS
IF NOT EXISTS (SELECT ForeignKey_Id FROM ForeignTable WHERE ForeignKey_Id = @ForeignKey_Id)
BEGIN
RAISERROR ('The input ForeignKey_Id does not exist', 16, 1)
RETURN;
END
INSERT INTO ChildTable (ForeignKey_Id, Attribute)
VALUES (@ForeignKey_Id, @Attribute)
Fiz isso porque queria capturar entradas FK inválidas no início da execução do procedimento armazenado antes que qualquer dado fosse inserido, especialmente para procs que executam vários INSERTs. Também pensei que seria uma boa maneira de retornar mensagens de erro precisas para facilitar a depuração. Esse padrão funciona bem para atender a esses dois objetivos.
Perguntas
Isso é uma perda de tempo?
Mais especificamente, devo confiar apenas nas restrições FK para validar os parâmetros FK e reverter se falhar?
Em última análise, isso prejudicará o desempenho do meu aplicativo à medida que o banco de dados cresce?