Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.05.2017, 15:06   #1
Alexsandr
Пользователь
 
Аватар для Alexsandr
 
Регистрация: 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.
Alexsandr вне форума Ответить с цитированием
Старый 25.05.2017, 15:16   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Есть 3 таблицы ADODATASET
ваще таблицы в базе, а не в датасетах

Настрой каскадное удаление в связях между таблицами в базе и ни какого триггера не потребуется. Ну а коль триггера захотелось, то в триггере на удаление из Students нужно удалять записи из Payment и Incident
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 25.05.2017 в 15:19.
Аватар вне форума Ответить с цитированием
Старый 25.05.2017, 15:20   #3
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Ну так и пишите:

Код:
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
если же Вам не нужно удалять, а только чистить поле s_id в остальных таблицах то вместо двух делетей нужно:

Код:
update Payment set id_s = null where id_s = @id_s
update Incident set id_s = null where id_s = @id_s
Но чтобы это сработало - требуется, чтобы поле id_s в этих таблицах было NULLABLE


Если у Вас маленькая БД и на ключи из Payment И incident больше никакие таблицы не завязаны - этого хватит. А по хорошему - нужно было создавать таблицы с внешним ключом ON DELETE CASCADE - тогда удаление в студентсах потащило бы за собой каскад соответствующих удалений в других таблицах, где id_s прописан как внешний ключ.

Ещё вариант реализации удаления: на основе триггеров. Создаёте для students триггер AFTER_DELETE и в нём реализуете удаление по s_id из других таблицы. В свою очередь для остальных таблиц штампуете такие же триггеры, удаляющие данные по их ключам. Но по сути - это тот же каскад, только сделанный вручную.
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 25.05.2017, 15:22   #4
Alexsandr
Пользователь
 
Аватар для Alexsandr
 
Регистрация: 30.09.2007
Сообщений: 70
По умолчанию

каскадное удаление в базе есть. В SQL Server Management Studio удаление работает, а как сделать удаление в клиентском приложении?
Alexsandr вне форума Ответить с цитированием
Старый 25.05.2017, 15:25   #5
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Если есть каскад - то когда Вы запустите свою хранимку на удаление из Students - остальное сделает СУБД за Вас.

Или вопрос был - как запустить удаление из клиента?

По идее, даже хранимка для этого не нужна, достаточно простого query или датасета

Код:
query1.Close;
query1.SQL.Text := 'Delete from students where s_id = :s_id';
query1.ParamByName('s_id').value := 126;
query1.ExecSQL;
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 25.05.2017, 15:27   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Дык есть каскадное, зачем триггер? На клиенте просто переоткрой таблицы после удаления студента
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 25.05.2017, 15:37   #7
Alexsandr
Пользователь
 
Аватар для Alexsandr
 
Регистрация: 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

по этому варианту не работает !?
Alexsandr вне форума Ответить с цитированием
Старый 25.05.2017, 15:39   #8
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Цитата:
Сообщение от Alexsandr Посмотреть сообщение
по этому варианту не работает !?
Он Вам и не нужен, если каскадное удаление настроено. Вашего исходного варианта вполне хватит.

Цитата:
Сообщение от Аватар Посмотреть сообщение
На клиенте просто переоткрой таблицы после удаления студента
После удаление не забудьте сделать
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 25.05.2017, 15:40   #9
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Если есть каскадное, зачем удалять из Payment и Incident? Из них записи СУБД само удалит при удалении студента. На то и каскадное удаление
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 25.05.2017, 21:29   #10
Alexsandr
Пользователь
 
Аватар для Alexsandr
 
Регистрация: 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;
Изображения
Тип файла: jpg диаграмма свзей последняя3.jpg (116.9 Кб, 146 просмотров)
Alexsandr вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Получить данные из связаных таблиц при помоши 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