![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Пользователь
Регистрация: 30.09.2007
Сообщений: 70
|
![]()
Доброго времени суток! Подскажите, как написать правильно хранимую процедуру на удаление связаны таблиц.
Есть 3 таблицы ADODATASET DataSetStudents (id_s, name) DataSetPayment (id_p, id_s, data) DataSetIncident (id_i, id_s, opisanie) компанент ADOStoredProc1 настроен правильно Текст процедуры : ALTER PROCEDURE [dbo].[StudentDelete] @id_s int AS Delete from students WHERE id_s=@id_s на кнопке удалить: procedure TMainForm.Button9Click(Sender: TObject); begin if MessageDlg('Вы уверены, что хотите удалить студента и связанные с ним данные?', mtConfirmation, [mbYes,mbNo],0)=mrYes then begin DM1.SPStudentDelete.Parameters.Para mByName('@id_s').Value:=DM1.Student sDataSetid_s.Value; try ConnectForm.ADOConnection1.BeginTra ns; DM1.SPStudentDelete.ExecProc; except ShowMessage('Удаление не получилось'); // Откатываем транзакцию ConnectForm.ADOConnection1.Rollback Trans; Exit; end; end; end; Но нечего не удаляет, что я делаю не так? Последний раз редактировалось Alexsandr; 25.05.2017 в 15:14. |
![]() |
![]() |
![]() |
#2 | |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
![]() Цитата:
Настрой каскадное удаление в связях между таблицами в базе и ни какого триггера не потребуется. Ну а коль триггера захотелось, то в триггере на удаление из Students нужно удалять записи из Payment и Incident
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Последний раз редактировалось Аватар; 25.05.2017 в 15:19. |
|
![]() |
![]() |
![]() |
#3 |
Старожил
Регистрация: 16.05.2012
Сообщений: 3,211
|
![]()
Ну так и пишите:
Код:
Код:
Если у Вас маленькая БД и на ключи из Payment И incident больше никакие таблицы не завязаны - этого хватит. А по хорошему - нужно было создавать таблицы с внешним ключом ON DELETE CASCADE - тогда удаление в студентсах потащило бы за собой каскад соответствующих удалений в других таблицах, где id_s прописан как внешний ключ. Ещё вариант реализации удаления: на основе триггеров. Создаёте для students триггер AFTER_DELETE и в нём реализуете удаление по s_id из других таблицы. В свою очередь для остальных таблиц штампуете такие же триггеры, удаляющие данные по их ключам. Но по сути - это тот же каскад, только сделанный вручную.
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
|
![]() |
![]() |
![]() |
#4 |
Пользователь
Регистрация: 30.09.2007
Сообщений: 70
|
![]()
каскадное удаление в базе есть. В SQL Server Management Studio удаление работает, а как сделать удаление в клиентском приложении?
|
![]() |
![]() |
![]() |
#5 |
Старожил
Регистрация: 16.05.2012
Сообщений: 3,211
|
![]()
Если есть каскад - то когда Вы запустите свою хранимку на удаление из Students - остальное сделает СУБД за Вас.
Или вопрос был - как запустить удаление из клиента? По идее, даже хранимка для этого не нужна, достаточно простого query или датасета Код:
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
|
![]() |
![]() |
![]() |
#6 |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
![]()
Дык есть каскадное, зачем триггер? На клиенте просто переоткрой таблицы после удаления студента
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
|
![]() |
![]() |
![]() |
#7 |
Пользователь
Регистрация: 30.09.2007
Сообщений: 70
|
![]()
ALTER PROCEDURE [dbo].[StudentDelete]
@id_s int AS Delete from students WHERE id_s=@id_s Delete from Payment WHERE id_s=@id_s Delete from Incident WHERE id_s=@id_s по этому варианту не работает !? |
![]() |
![]() |
![]() |
#8 |
Старожил
Регистрация: 16.05.2012
Сообщений: 3,211
|
![]()
Он Вам и не нужен, если каскадное удаление настроено. Вашего исходного варианта вполне хватит.
После удаление не забудьте сделать
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
|
![]() |
![]() |
![]() |
#9 |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
![]()
Если есть каскадное, зачем удалять из Payment и Incident? Из них записи СУБД само удалит при удалении студента. На то и каскадное удаление
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
|
![]() |
![]() |
![]() |
#10 |
Пользователь
Регистрация: 30.09.2007
Сообщений: 70
|
![]()
Помогите кто не будь, не удаляет и всё. Каскадное удаление стоит на
FK_payment_students и FK_incident_students. ПО варианту ALTER PROCEDURE [dbo].[StudentDelete] @id_s int AS Delete from students WHERE id_s=@id_s Delete from Payment WHERE id_s=@id_s Delete from Incident WHERE id_s=@id_s и обновлении таблиц в клиенте procedure TMainForm.Button9Click(Sender: TObject); begin begin if MessageDlg('Вы уверены, что хотите удалить студента и связанные с ним данные?', mtConfirmation, [mbYes,mbNo],0)=mrYes then begin DM1.SPStudentDelete.Parameters.Para mByName('@id_s').Value := DM1.StudentsDataSetid_s.Value; try ConnectForm.ADOConnection1.BeginTra ns; DM1.SPStudentDelete.ExecProc; except ShowMessage('Удаление не получилось'); // Откатываем транзакцию ConnectForm.ADOConnection1.Rollback Trans; exit; end; DM1.StudentsDataSet.Close; DM1.StudentsDataSet.Open; DM1.IncidentDataSet.Close; DM1.IncidentDataSet.Open; DM1.PaymentDataSet.Close; DM1.PaymentDataSet.Open; end; end; end; |
![]() |
![]() |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Получить данные из связаных таблиц при помоши IN ? | ADSoft | SQL, базы данных | 4 | 31.10.2013 09:13 |
Хранимая процедура | mavlon_m | SQL, базы данных | 7 | 07.09.2013 15:15 |
Хранимая процедура для двух таблиц | iloer | БД в Delphi | 0 | 26.05.2010 11:15 |
запрос вставки связаных таблиц | Domanoff | БД в Delphi | 0 | 20.04.2010 17:55 |
Удаление в связаных таблицах ADO | Alexsandr | БД в Delphi | 7 | 18.02.2008 23:15 |