У меня есть 2 таблицы. Ниже приведены только обезжиренные версии этих таблиц.Как исправить эту проблему с хранимой процедурой
TableA
Id <pk> incrementing
Name varchar(50)
TableB
TableAId <pk> non incrementing
Name varchar(50)
Теперь эти таблицы имеют отношение друг к другу.
Сценарий
Пользователь 1 приходит на мой сайт и делает какие-то действия (в данном случае добавляет строки в таблице A). Поэтому я использую SqlBulkCopy для всех этих данных в таблице A.
Однако мне нужно добавить данные также в таблицу B, но я не знаю вновь созданного Идентификатора из таблицы A, поскольку SQLBulkCopy не вернет их.
Так что я имею в виду иметь хранимую процедуру, которая находит все идентификаторы, которые не существуют в таблице B, а затем вставьте их в.
INSERT INTO TableB (TableAId , Name)
SELECT Id,Name FROM TableA as tableA
WHERE not exists(...)
Однако это приходит с проблемой. Пользователь в любое время может удалить что-то из TableB, поэтому, если пользователь удаляет строку, а затем появляется другой пользователь, или даже тот же пользователь приходит и делает что-то в таблице. Моя хранимая процедура вернет эту удаленную строку в таблицу B. Поскольку он все еще будет существовать в таблице A, но не в таблице B и, таким образом, будет удовлетворять условию хранимой процедуры.
Итак, есть ли лучший способ справиться с двумя таблицами, которые необходимо обновить при использовании массовой вставки?
Я уверен, что вся суть RDMS заключается в том, чтобы избежать проблем взаимного исключения и обновления при наличии нескольких параллельных соединений.Я не эксперт по БД и не играю по телевизору, но, насколько мне известно, есть конструкции, которые вы можете использовать, чтобы сделать запрос «атомарным». –
@San Jacinto: правильно, но SQLBulkCopy - это сложность. Даже тогда более поздние записи не могут отличить, какие строки принадлежат им, из предыдущих записей с пробелами в B. – gbn