使用 SP 克隆数据库记录的最佳方法
Posted
技术标签:
【中文标题】使用 SP 克隆数据库记录的最佳方法【英文标题】:Best Approach for Cloning database records using SPs 【发布时间】:2009-02-11 01:53:49 【问题描述】:我必须编写代码来克隆具有其他表中相关数据的数据库条目,并为其分配一个新 ID。简化后,我有一个带有 ID 键的主表和子表说 SUB1,带有 ID 的 FK 和 MAIN 中每个条目的多个记录。 我想将 MAIN 中特定 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
我看到 CopyNewSub1Records 类似于
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 的 newID 的 OUT 与 IN 中的 CopyNewSub1Records 相同,并且我可以在调用插入 SP 时使用来自 CopyNewSub1Records 中的 Get SP 的多行的结果集来循环遍历吗?
我目前正在等待被 DB 管理员授予在我们的 DB2 环境中创建 SP 的权限,所以这就是我询问而不是尝试这样做的原因。
【问题讨论】:
【参考方案1】:我对 DB2 不太熟悉,但我认为直接插入比尝试跨范围使用游标要好得多。
将复制主存储过程的输出参数作为其他存储过程的输入对我来说非常有意义。
作为我将如何创建 CopyNewSub1Records 的示例,我将执行以下操作: (请原谅任何语法问题......就像我说的,我不使用 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】:我从未使用过 DB2,但它不支持触发器吗?
听起来您要做的是建立一个审计表。我以前在 SQL Server 中做过这个,并且做得正确,它可能非常有用。您应该能够通过谷歌搜索“DB2 Audit Trigger”或类似内容找到一些有用的信息。
【讨论】:
以上是关于使用 SP 克隆数据库记录的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章
Clonezilla克隆硬盘后,Suse11sp3开机报错couln‘t find disk