Здравствуйте,
Столкнулся с несколько нестандартной ситуацией и хотелось бы обсудить как лучше/правильнее поступать в таких случаях.
Есть две таблицы master - detail.
Для каждой строки мастера должна быть хотя бы одна строка деталей.
Как лучше всего обеспечить такое условие на уровне базы данных? MS SQL Server 2008 если это важно.
Стандартный referential integrity просто устанавливает связь 1-M и не позволит заносить строки в детали, для которых нету мастера, и не позволит удалить строку мастера, если есть хотя бы одна строка деталей.
Добавление новых данных проблем не представляет. Программа должно использовать хранимую процедуру при добавлении строки мастера. Процедура позаботится о создании и мастера и первой строки деталей.
Сложности возникают при попытке удалить строку деталей.
Если деталей больше одной, то удалять можно, а если осталась только одна, то удалять уже нельзя.
Как лучше всего написать хранимую процедуру для удаления одной строки деталей с этой проверкой? Естественно, что все должно работать корректно в случае многих пользователей, вносящих изменения одновременно.
Простейший пример:
мастер - одна строка
детали - две строки, относящиеся к одному мастеру
Есть два пользователя на разных клиентах. Оба видят, что деталей две и одновременно первый пользователь пытается удалить первую строку деталей, второй пользователь пытается удалить вторую строку деталей.
Хранимая процедура удаления запускается одновременно два раза. В результате не должно оказаться так, что в деталях не осталось ни одной строки. Какая из двух строк останется - неважно. Можно и обе оставить.
Какие будут идеи?
Столкнулся с несколько нестандартной ситуацией и хотелось бы обсудить как лучше/правильнее поступать в таких случаях.
Есть две таблицы master - detail.
Для каждой строки мастера должна быть хотя бы одна строка деталей.
Как лучше всего обеспечить такое условие на уровне базы данных? MS SQL Server 2008 если это важно.
Стандартный referential integrity просто устанавливает связь 1-M и не позволит заносить строки в детали, для которых нету мастера, и не позволит удалить строку мастера, если есть хотя бы одна строка деталей.
Добавление новых данных проблем не представляет. Программа должно использовать хранимую процедуру при добавлении строки мастера. Процедура позаботится о создании и мастера и первой строки деталей.
Сложности возникают при попытке удалить строку деталей.
Если деталей больше одной, то удалять можно, а если осталась только одна, то удалять уже нельзя.
Как лучше всего написать хранимую процедуру для удаления одной строки деталей с этой проверкой? Естественно, что все должно работать корректно в случае многих пользователей, вносящих изменения одновременно.
Простейший пример:
мастер - одна строка
детали - две строки, относящиеся к одному мастеру
Есть два пользователя на разных клиентах. Оба видят, что деталей две и одновременно первый пользователь пытается удалить первую строку деталей, второй пользователь пытается удалить вторую строку деталей.
Хранимая процедура удаления запускается одновременно два раза. В результате не должно оказаться так, что в деталях не осталось ни одной строки. Какая из двух строк останется - неважно. Можно и обе оставить.
Какие будут идеи?
Comment