2009-07-23 8 views
0

Je souhaite copier une ligne dans SQL contenant des enregistrements enfants dans 2 autres tables. Je veux les dupliquer tous si la fiche est dupliquée. Par exemple, si je dis que je veux copier la fiche avec l'identifiant 15 dans un nouvel enregistrement. Je souhaite également que tous les enregistrements enfants soient dupliqués avec le nouvel ID d'enregistrement de master. peut le faire via TSQL en utilisant des boucles et des conditions. mais je veux juste savoir s'il y a de meilleures options.SQL-Copie d'un enregistrement avec ses enregistrements enfants associés

Merci.

Répondre

1

La meilleure option consiste à utiliser un déclencheur INSERT sur votre table principale qui obtient les enfants de la ligne précédente correspondante et les insère dans la table enfant.

Je suis très rouillé à déclencheurs, mais quelque chose comme ceci:

CREATE TRIGGER tr_master ON master FOR AFTER INSERT AS 
    INSERT INTO childtable(masterid, childvalue) 
     SELECT inserted.id, oldchildren.childvalue 
     FROM inserted INNER JOIN childtable oldchildren 
     ON oldchildren.masterid = inserted.copiedfromid 
    ) 

Depuis, lorsque le déclencheur se produit, il ne « connaît » qui enregistrent maître l'enregistrement inséré actuel (s) ont été copiés à partir de, vous devrez suivre la clé primaire de l'enregistrement d'origine dans une colonne de la table principale (que j'ai appelé "copiedfromid" ici). "Inséré" est une table spéciale disponible dans un déclencheur qui contient toutes les lignes insérées dans votre table principale dans cette transaction. J'ai utilisé "FOR AFTER INSERT" plutôt que "INSERT INSERT" parce que je suppose que la clé étrangère de votre table enfant applique l'intégrité référentielle avec la table maître, donc je dois penser que vous devez seulement déclencher cette action après l'insertion .

+0

D'où ce déclencheur obtient-il ses informations "oldchildren"? –

+0

De la table des enfants, que j'ai alias "oldchildren" pour plus de clarté. Il trouve les enfants appartenant à l'ID "copiedfromid", que vous devez fournir avec chaque nouvel enregistrement copié. – richardtallent

+0

bien comment pouvons-nous trouver si c'est un nouvel insert ou un processus de copie. quand nous faisons une nouvelle insertion, le déclencheur s'exécute correctement? – Aneef

1

EDIT Modifié pour mieux répondre aux exigences de l'OP.

Si vous ne copiez qu'une seule fiche à la fois. Utilisez ensuite une procédure stockée pour copier le maître et les enfants. Inclure la gestion des erreurs et le contrôle des transactions sur le produit stocké. Le code de copie serait insérer des instructions comme suit:

declare @NewMasterId int -- or the appropriate type. 
    insert into MasterCopy (column names ...) 
    select column names .. 
    from Master 
    where MasterId = @MasterId 
    set @NewMasterId = scope_identity 

    insert into ChildCopyA (MasterId, column names ...) 
    select @NewMasterId, column names ... 
    from ChildA 
    where MasterId = @MasterId -- FK to master table. 

    insert into ChildCopyB (MasterId, column names ...) 
    select @NewMasterId, column names ... 
    from ChildB 
    where MasterId = @MasterId -- FK to master table. 
+0

Cela ne fonctionnera pas ... l'OP veut réinsérer dans la table principale, pas dans une copie de la table principale. Ainsi, lors de l'insertion de la fiche en double, l'identifiant principal sera différent de l'identifiant principal d'origine. – richardtallent

+0

@Richardtallet. J'ai mal lu la question. –

Questions connexes