J'ai 2 tables. Ce qui suit sont juste une version dépouillée de ces tables.Comment résoudre ce problème de procédure stockée
TableA
Id <pk> incrementing
Name varchar(50)
TableB
TableAId <pk> non incrementing
Name varchar(50)
Maintenant, ces tables ont une relation entre elles.
Scénario
utilisateur 1 vient à mon site et fait quelques actions (dans ce cas, ajoute des lignes au tableau A). Donc j'utilise une SqlBulkCopy toutes ces données dans le tableau A.
Cependant, j'ai besoin d'ajouter les données à la table B mais je ne connais pas les ID nouvellement créés dans la table A car SQLBulkCopy ne les retournera pas.
Je pense d'avoir une procédure stockée qui trouve tous les id qui n'existent pas dans le tableau B, puis les insérer dans.
INSERT INTO TableB (TableAId , Name)
SELECT Id,Name FROM TableA as tableA
WHERE not exists(...)
Cependant, cela vient avec un problème. Un utilisateur peut à tout moment supprimer quelque chose de la TableB, donc si un utilisateur supprime une ligne et qu'un autre utilisateur arrive ou même que le même utilisateur arrive et fait quelque chose à la Table A, ma procédure stockée ramènera cette ligne supprimée dans le Tableau B. Comme il existera toujours dans la table A mais pas dans la table B et satisfera ainsi la condition de procédure stockée.
Alors, existe-t-il une meilleure façon de traiter deux tables qui doivent être mises à jour lors de l'utilisation d'encarts en bloc?
Je suis à peu près sûr que tout le but de RDMS est d'éviter l'exclusion mutuelle et de mettre à jour les problèmes lors de plusieurs connexions simultanées.Je ne suis pas un expert de la DB, et je ne joue pas à la télévision, mais à ma connaissance, il existe des constructions que vous pouvez utiliser pour rendre la requête "atomique". –
@San Jacinto: correct, mais SQLBulkCopy est une complication. Même alors, les écritures ultérieures ne peuvent pas distinguer les lignes qui sont les leurs, qui proviennent des écritures précédentes avec des espaces dans B. – gbn