Trabalhando com OUTPUT e Foreign Keys

Quando se utiliza a cláusula OUTPUT em tabelas físicas com foreign keys, é possível surgir problemas com as referências, mesmo que seja um INSERT em uma tabela mãe (tabela referenciada) e com OUTPUT em uma tabela filha (tabela que possui a referência), exemplo:

CREATE TABLE Categoria (
	Codigo INT IDENTITY,
	Descricao VARCHAR(90) NOT NULL,
	CONSTRAINT PK_Categoria PRIMARY KEY (Codigo)
);
GO

CREATE TABLE Produto (
	Codigo INT IDENTITY,
	Categoria INT NOT NULL,
	Descricao VARCHAR(90) NOT NULL,
	CONSTRAINT PK_Produto PRIMARY KEY (Codigo),
	CONSTRAINT FK_Produto_Categoria FOREIGN KEY (Categoria)
		REFERENCES Categoria(Codigo)
);
GO

INSERT INTO Categoria
	OUTPUT INSERTED.Codigo, 'Limão' INTO Produto
VALUES ('Frutas');

Msg 332, Level 16, State 1, Line 18 The target table 'Produto' of the OUTPUT INTO clause cannot be on either side of a (primary key, foreign key) relationship. Found reference constraint 'FK_Produto_Categoria'.

A melhor maneira de se tratar isso é não ter foreign keys na tabela filha e foreign keys que referenciam a tabela filha, mas também é possível desabilitar as foreign keys durante o processo, exemplo:

ALTER TABLE Produto
NOCHECK CONSTRAINT FK_Produto_Categoria;
GO

INSERT INTO Categoria
	OUTPUT INSERTED.Codigo, 'Limão' INTO Produto
VALUES ('Frutas');
GO

ALTER TABLE Produto
CHECK CONSTRAINT FK_Produto_Categoria;

O problema de desabilitar as foreign keys é possibilidade de erro após a inserção e o fato do usuário que executa esta operação ter acesso de alteração da estrutura do banco de dados (ALTER TABLE).

Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s