【问题标题】:oracle - how to remove table dependents without on delete cascadeoracle - 如何在不删除级联的情况下删除表依赖项
【发布时间】:2014-06-10 19:15:01
【问题描述】:

我有以下 oracle 表:

Family= { pk_id_family, nm_family } 
Generation_1 = { pk_id_gen_1, nm_gen_1, fk_id_family} 
Dependent_gen_1 = { pk_id_dep_gen_1, nm_dep_gen_1, fk_id_gen_1 }
Dependent_gen_2 = { pk_id_dep_gen_2, nm_dep_gen_2, fk_id_dep_gen_1 }
Acquainted = {pk_id_acquainted, nm_acquainted, fk_id_gen_1 }

我想创建一个接收 pk_id_family 作为参数的过程,并在 Generation_1 中递归删除,并在从 Generation_1 删除之后(使用 fk_id_family ) 继续从 Dependent_gen_2 中删除(使用 fk_id_dep_gen_1)等等,直到 熟悉

注意:我可以在约束上激活 DELETE CASCADE,但我想知道是否有其他方法

触发器不是一个选项,因为我不想更改表格的行为。该程序不会经常使用。 我不想使用触发器更改表格行为。

谢谢

【问题讨论】:

    标签: sql oracle stored-procedures oracle11g oracle10g


    【解决方案1】:

    我不能 100% 确定 Oracle,但您可以通过删除触发器来做到这一点。 您可以在此链接中找到有关触发器的更多信息。

    http://docs.oracle.com/cd/A57673_01/DOC/server/doc/SCN73/ch15.htm

    【讨论】:

    • 没错,但我的目标是创建一个可以集中所有删除的程序。我不想触及架构行为。如果我使用触发器,表将始终以这种方式运行,此外它会将代码传播到各处(难以维护)。谢谢
    【解决方案2】:

    理论上,您可以使用加入家谱来删除数据,但那将是可怕的代码,类似于

    DELETE FROM Acquainted 
     WHERE fk_id_gen_1 IN 
           (SELECT fk_id_gen_1 
              FROM Dependent_gen_1 
              JOIN Generation_1    ON fk_id_gen_1=pk_id_gen1
             WHERE fk_id_family= my_parameter);
    
    DELETE FROM Dependent_gen_2 
     WHERE fk_id_dep_gen_1 IN 
           (SELECT pk_id_dep_gen_1 
              FROM Dependent_gen_1 
              JOIN Generation_1    ON fk_id_gen_1=pk_id_gen1
             WHERE fk_id_family= my_parameter);
    

    等等……

    【讨论】:

    • 是的,这是一种方法,但我需要做很多工作。我一直在寻找一些可以帮助我在程序中执行此操作的 oracle 函数或指令。感谢您的帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-14
    • 2020-04-03
    • 1970-01-01
    • 2018-11-25
    • 1970-01-01
    相关资源
    最近更新 更多