代码之家  ›  专栏  ›  技术社区  ›  MadMurf

使用SP克隆数据库记录的最佳方法

  •  0
  • MadMurf  · 技术社区  · 17 年前

    我必须编写代码来克隆一个数据库条目和其他表中的相关数据,并为其分配一个新的ID。简化后,我有一个主表,其键为ID,子表为sub1,其fk为ID,每个条目的主记录为多个。
    我要将主中特定ID的数据复制到新记录中,将ID更新为新值,以允许现有条目及时保留为快照,并将新条目作为正在进行的新工作。

    我希望使用存储过程,并想知道是否可以/建议使用一个调用其他SP来执行该工作的高级SP?

    例如

    
        CREATE PROCEDURE CopyNewVersion (IN oldID)
        ...
        BEGIN
        --copy main record details for passed in oldID, 
        --return the new ID thats been allocated
          CALL CopyNewMainRecord(IN oldID, OUT newID )
        --copy all SUB1 records for oldID to newID
          CALL CopyNewSub1Records(IN oldID, IN newID)
        --Declare a cursor to return the details in MAIN for newID
        END
    

    我看到CopyNewSub1记录有点像

    
        CREATE PROCEDURE CopyNewSub1Records (IN oldID, IN NewID)
        ...
        BEGIN
          --select all records in SUB1 with FK oldID
          --sp opens a cursor for return 
          CALL GetSUB1Records(oldID)
          for each returned record in the cursor resultset
            --insert into SUB1 values(newID, other data for this row,....)
            CALL CreateSUB1Record(row details)
        END
    

    因此,我的问题是,是否可以将copyNewMainRecord中的out-of-newID设置为in-to-copyNewSub1记录,并且可以使用copyNewSub1记录中get-sp的多行resultset在调用insert-sp时进行循环?

    我目前正在等待数据库管理员授予我在我们的DB2环境上创建SP的权限,所以这就是为什么我要求而不是尝试这样做的原因。

    2 回复  |  直到 17 年前
        1
  •  1
  •   Tom H zenazn    17 年前

    我不太熟悉DB2,但我认为直接插入比在范围内使用光标更好。

    将copy主存储过程的输出参数作为其他存储过程的输入对我来说非常有意义。

    作为如何创建copyNewSub1记录的示例,我将执行如下操作: (请原谅任何语法问题…如我所说,我不使用DB2——您如何知道列中的参数?)

    CREATE PROCEDURE CopyNewSub1Records (IN oldID, IN NewID)
    BEGIN
         INSERT INTO Sub1
         (
              ID,
              SubID,
              Col1,
              Col2
         )
         SELECT
              NewID,
              SubID,
              Col1,
              Col2
         FROM
              Sub1
         WHERE
              ID = oldID
    END
    
        2
  •  0
  •   RKitson    17 年前

    我从未使用过DB2,但它不支持触发器吗?

    听起来您要做的就是构建一个审计表。我以前在SQL Server中做过,并且做得正确,这非常有用。您应该能够通过谷歌搜索“DB2AuditTrigger”或类似的东西找到一些好的信息。