sql - 存储过程。检查约束是否在另一个表中使用
问题描述
我收到此错误消息:
DELETE 语句与 REFERENCE 约束“FK_FieldMapper_Field”冲突。冲突发生在数据库“SCAM”、表“dbo.FieldMapper”、列“FieldID”中。
我有一些具有给定数量的字段的访问助手。这些字段可以被多个访问助手使用。
当我删除一个accesshelper
时,我需要检查fields
给定accesshelper
的是否被其他使用accesshelpers
。如果是,我将删除 accesshelper,但不删除字段,因为这会破坏其他 accesshelper。我怎么做?
到目前为止,这是我自己想出的。
USE [SCAM]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[deleteAccessHelperById]
@Id int
AS
BEGIN
SET NOCOUNT ON;
DECLARE @projectIds TABLE (id int);
INSERT INTO @projectIds ([id]) SELECT dbo.AccessHelperMapper.ProjectID FROM dbo.AccessHelperMapper WHERE dbo.AccessHelperMapper.AccessHelperID = @Id;
DELETE dbo.AccessHelperMapper WHERE dbo.AccessHelperMapper.AccessHelperID = @Id;
DECLARE @fieldIds TABLE (id int);
INSERT INTO @fieldIds ([id]) SELECT dbo.FieldMapper.FieldID FROM dbo.FieldMapper WHERE dbo.FieldMapper.AccessHelperID = @Id;
DECLARE @AHfields TABLE (id int)
Insert into @AHfields
Select fids.id from dbo.FieldMapper, @fieldIds as fids
where dbo.FieldMapper.AccessHelperID != @Id
and fids.id != dbo.FieldMapper.FieldID;
delete dbo.FieldMapper where dbo.FieldMapper.AccessHelperID = @Id and dbo.FieldMapper.FieldID IN (SELECT d.id FROM @AHfields as d);
delete dbo.Field where dbo.Field.ID in (SELECT g.id FROM @AHfields as g);
delete dbo.AccessHelper where dbo.AccessHelper.ID = @Id;
END
解决方案
试试下面的代码。希望这是您正在寻找的:
USE [SCAM]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[deleteAccessHelperById]
@Id int
AS
BEGIN
SET NOCOUNT ON;
DELETE dbo.AccessHelperMapper WHERE dbo.AccessHelperMapper.AccessHelperID = @Id;
DECLARE @fieldIds TABLE (id int);
INSERT INTO @fieldIds ([id]) SELECT dbo.FieldMapper.FieldID FROM dbo.FieldMapper WHERE dbo.FieldMapper.AccessHelperID = @Id
AND dbo.FieldMapper.FieldID NOT IN (SELECT DISTINCT dbo.FieldMapper.FieldID FROM dbo.FieldMapper WHERE dbo.FieldMapper.AccessHelperID != @Id);
delete dbo.FieldMapper where dbo.FieldMapper.AccessHelperID = @Id --and dbo.FieldMapper.FieldID IN (SELECT d.id FROM @fieldIds as d);
delete dbo.Field where dbo.Field.ID in (SELECT g.id FROM @fieldIds as g);
delete dbo.AccessHelper where dbo.AccessHelper.ID = @Id;
END
推荐阅读
- nginx - 将多行 jinja2 块转换为单行
- git - 我需要在项目中进行更改并且不让 git 确认更改
- azure - Terraform 模块 azure 事件订阅可选字段
- php - 在 PHP 中接收 POSTed XML 文件时出现问题
- python - 将多个 CSV 文件导入 Postgresql
- c++ - C++程序编译器使用g++命令编译后自动运行exe文件
- acumatica - 如何在发布 POReceiptEntry 期间将数据附加到 INTranCost 上的自定义字段?
- apache-spark - 使用 PySpark 将数据从 HDFS 索引到 Elastic Search
- excel - 运行时错误 1004:保护工作表后宏不起作用
- reactjs - 将辅助功能道具传递给 Material UI 按钮