Лучший подход для клонирования записей базы данных с использованием SP - PullRequest
0 голосов
/ 11 февраля 2009

Мне нужно написать код для клонирования записи базы данных со связанными данными в других таблицах и присвоения ей нового идентификатора. Упрощенно У меня есть ОСНОВНАЯ таблица с ключом ID, а подтаблица - SUB1 с FK ID и несколькими записями для каждой записи в MAIN.
Я хочу скопировать данные для определенного идентификатора в MAIN в новые записи, обновив идентификатор до нового значения, чтобы позволить существующей записи оставаться в виде моментального снимка во времени, а новая запись - новой незавершенной работой.

Я хочу использовать хранимые процедуры и задаюсь вопросом, возможно ли / целесообразно ли иметь высокоуровневый 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

Итак, мой вопрос: можно ли использовать OUT newID из CopyNewMainRecord, как в IN, для CopyNewSub1Records, и можно ли использовать набор результатов с несколькими строками из Get SP в CopyNewSub1Records для циклического прохождения при вызове вставки SP?

В настоящее время я ожидаю, что администратор БД предоставит мне права на создание SP в нашей среде DB2, поэтому я спрашиваю, а не пытаюсь это сделать.

Ответы [ 2 ]

1 голос
/ 11 февраля 2009

Я не слишком знаком с 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
0 голосов
/ 11 февраля 2009

Я никогда не использовал DB2, но разве он не поддерживает триггеры?

Похоже, что вы хотите сделать, это создать таблицу аудита. Я делал это раньше в SQL Server и сделал правильно, это может быть весьма полезно. Вы сможете найти полезную информацию, прибегая к помощи «DB2 Audit Trigger» или подобному.

...