实现删除主表数据时, 判断与之关联的外键表是否有数据引用, 有标志, 无则删除

本文介绍了一个SQL Server 2000的安全删除存储过程,该过程考虑了表间存在的外键关系,避免了直接级联删除可能带来的数据丢失风险。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

-- SQL Server 2000 对错误处理不好控制, 一般还是建议做判断

-- 通过系统表查询系统表,可以获取某个表关联的所有外键表

 

-- 示例存储过程

CREATE PROC dbo.p_Delete

    @tbname sysname,        -- 基础数据表名

    @PkFieldName sysname,   -- 基础数据表关键字段名

    @PkValue int            -- 要删除的基础数据表关键字值

AS

SET NOCOUNT ON

DECLARE @bz bit, @s nvarchar(4000)

DECLARE tb CURSOR LOCAL

FOR

SELECT N'

SET @bz = CASE WHEN EXISTS(

        SELECT * FROM ' + QUOTENAME(@tbname)

        + N' A, ' + QUOTENAME(OBJECT_NAME(B.fkeyid))

        + N' B

        WHERE A.' + QUOTENAME((SELECT name FROM syscolumns WHERE colid = B.rkey AND id = B.rkeyid))

        + N' = B.' + QUOTENAME((SELECT name FROM syscolumns WHERE colid = B.fkey AND id = B.fkeyid))

        + N' AND A.' + QUOTENAME((SELECT name FROM syscolumns WHERE colid = B.rkey AND id = B.rkeyid))

        + N' = @id) THEN 1 ELSE 0 END'

FROM sysobjects A

    JOIN sysforeignkeys B

        ON A.id=  B.constid

    JOIN sysobjects C

        ON A.parent_obj = C.id

WHERE A.xtype = 'f'

    AND C.xtype = 'U'

    AND OBJECT_NAME(B.rkeyid) = @tbname

OPEN tb

FETCH tb INTO @s

WHILE @@FETCH_STATUS = 0

BEGIN

    EXEC sp_executesql @s, N'@tbname sysname, @id int, @bz bit OUT', @tbname, @PkValue, @bz OUT

    IF @bz = 1

    BEGIN

        SET @s = N'UPDATE ' + QUOTENAME(@tbname)

            + N' SET bz = 1 WHERE ' + QUOTENAME(@PkFieldName)

            + N' = @id'

        EXEC sp_executesql @s, N'@id int', @PkValue

 

        RETURN

    END

 

    FETCH tb INTO @s

END

CLOSE tb

DEALLOCATE tb

 

SET @s = N'DELETE FROM ' + QUOTENAME(@tbname)

    + N' WHERE ' + QUOTENAME(@PkFieldName)

    + N' = @id'

EXEC sp_executesql @s, N'@id int', @PkValue

GO

 

注意事项

设置表的主/外键关系的时候,不要设置级联删除(ON DELETE CASCADE

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值