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

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

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 01.05.2009, 10:20   #1
Абдуллаев Рустам
Пользователь
 
Регистрация: 01.05.2009
Сообщений: 37
По умолчанию Каскадное удаление и модификация таблиц

Всем Привет!
Помогите решить такую вот проблему:
В общем есть кусочек базы данных, задействовано 4 таблицы, одна главная с ключом us_id, одна ассоциативная с внешним us_id и cab_id, соттветственно cab_id из таблицы cabinets, так вот задача заключается в том чтобы удаляя или модифицируя записи в главной таблице users, изменения происходили и в таблице(ассоциативной) cab_users. Написал для удаления storedproc в котором сразу удаляются записи из 2 таблиц, так он ругается, сделал по-другому, создал 2 storedproc, причем сначала удаляю записи в ассоциативной в первом storedproc, и потом если первый stored proc выполнился, выполняю storedproc второй по удалению из главной таблице, той записи, которая соотв. удал-му us_id в первой. - так все выходит.
вот первый:
CREATE PROCEDURE dobdelus(
@usid bigint)
AS
delete from cab_users
where us_id=@usid and cab_id=0
GO
вот второй
CREATE PROCEDURE delus2(
@usid bigint)
AS
delete from cab_users
where us_id=@usid
GO
Не думаю что так все правильно, да и емко, не подскажете что мешает удалению записей, если эти две процедуры совмещать в одну, и как лучше сделать, и еще почему когда работаешь со storedproc и начинаешь запускать ее в delphi, всегда возникает ошибка: Parameter '@usid' not found. или not supplied?
mol4ok
Абдуллаев Рустам вне форума Ответить с цитированием
Старый 01.05.2009, 17:03   #2
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

1) ошибки при объединении кода двух процедур из-за того, что данные, которые ты пытаешся удалить из родительской таблицы есть в дочерней, но в другой записи/записях
т.е. тебе нужно еще делать доп.проверку - узнать есть ли такие записи в дочерней и если нет, то удалить в родительской
вот только почему-то у тебя в обеих процедурах прописана одна и та же таблица...

2) параметр в дельфаке скорее всего надо указывать под именем 'usid'
soleil@mmc вне форума Ответить с цитированием
Старый 01.05.2009, 17:13   #3
Абдуллаев Рустам
Пользователь
 
Регистрация: 01.05.2009
Сообщений: 37
По умолчанию Ответ soleil@mmc

Цитата:
Сообщение от soleil@mmc Посмотреть сообщение
1) ошибки при объединении кода двух процедур из-за того, что данные, которые ты пытаешся удалить из родительской таблицы есть в дочерней, но в другой записи/записях
т.е. тебе нужно еще делать доп.проверку - узнать есть ли такие записи в дочерней и если нет, то удалить в родительской
вот только почему-то у тебя в обеих процедурах прописана одна и та же таблица...

2) параметр в дельфаке скорее всего надо указывать под именем 'usid'
Этот параметр я прописал и создал процедуру в sql server 2000. Там через собачку принято.
Про проверку, конечно в принципе понял, нужно будет подумать над созданием проверки. Спасибо.
mol4ok
Абдуллаев Рустам вне форума Ответить с цитированием
Старый 01.05.2009, 17:16   #4
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

Цитата:
Сообщение от Абдуллаев Рустам Посмотреть сообщение
Этот параметр я прописал и создал процедуру в sql server 2000. Там через собачку принято.
замечательно
но то что принято там, не означает, что принято в дельфаке
возьми сделай препаре сторпроц и выведи в цикле считанные имена параметров и сразу все станет ясно
soleil@mmc вне форума Ответить с цитированием
Старый 01.05.2009, 17:29   #5
Абдуллаев Рустам
Пользователь
 
Регистрация: 01.05.2009
Сообщений: 37
По умолчанию

Цитата:
Сообщение от soleil@mmc Посмотреть сообщение
замечательно
но то что принято там, не означает, что принято в дельфаке
возьми сделай препаре сторпроц и выведи в цикле считанные имена параметров и сразу все станет ясно
Я с этим незнаком, особкенно с препаре, - это подготовка что-ли? Или проверка этой процедуры, знаете у меня еще один давно назревший и мучающий меня вопрос есть, может сталкивались с этой проблемой. Вот создаю приложение на delphi, база на sql server 2000. Работа объемная, так как это диплом, и поэтому очень много stored proc приходится создавать, на обновление таблиц, удаление, и почти каждая процедура при компиляции ругается, типа Parameter '@usid' not found. или not supplied. Потом что-то потыкаю, поперебираю и каким-то образом начинает все работать, а в чем проблема я так и не понял, не сталкивались с такой проблебой?
mol4ok
Абдуллаев Рустам вне форума Ответить с цитированием
Старый 01.05.2009, 20:13   #6
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

думаю, что ошибки исчезают когда ты тыкаешь в компонент и считываешь его параметры, но они снова появятся если ты добавишь/переименуешь существующие параметры

короче, работа с ХП (хранимые процедуры) такая:
Код:
var
  SP: TStoredProc;

begin
  //SP.Database уже присвоено 
  SP.StoredProcName := 'STORED_PROC_NAME';
  SP.Prepare;
  SP.ParamByName('PARAM1').AsInteger := PARAM1;
  SP.ParamByName('PARAM2').AsInteger := PARAM2;
  SP.ExecProc;
end;
а так ты можешь прочитать все параметры
Код:
var
  SP: TStoredProc;
  i: integer;
  s: string;
begin
  //SP.Database уже присвоено 
  SP.StoredProcName := 'STORED_PROC_NAME';
  SP.Prepare;
  s:='';
  for i:=0 to SP.Params.Count-1 do
    s:=s+'<'+SP.Params[i].Name+'>';
  ShowMessage(s);
end;

Последний раз редактировалось soleil@mmc; 01.05.2009 в 20:22.
soleil@mmc вне форума Ответить с цитированием
Старый 01.05.2009, 20:47   #7
Абдуллаев Рустам
Пользователь
 
Регистрация: 01.05.2009
Сообщений: 37
По умолчанию

Цитата:
Сообщение от soleil@mmc Посмотреть сообщение
думаю, что ошибки исчезают когда ты тыкаешь в компонент и считываешь его параметры, но они снова появятся если ты добавишь/переименуешь существующие параметры

короче, работа с ХП (хранимые процедуры) такая:
Код:
var
  SP: TStoredProc;

begin
  //SP.Database уже присвоено 
  SP.StoredProcName := 'STORED_PROC_NAME';
  SP.Prepare;
  SP.ParamByName('PARAM1').AsInteger := PARAM1;
  SP.ParamByName('PARAM2').AsInteger := PARAM2;
  SP.ExecProc;
end;
а так ты можешь прочитать все параметры
Код:
var
  SP: TStoredProc;
  i: integer;
  s: string;
begin
  //SP.Database уже присвоено 
  SP.StoredProcName := 'STORED_PROC_NAME';
  SP.Prepare;
  s:='';
  for i:=0 to SP.Params.Count-1 do
    s:=s+'<'+SP.Params[i].Name+'>';
  ShowMessage(s);
end;
Да, интересно, обязательно попробую, и вы правы насчет пересчитывания мной параметров, я так и делал, попробую ваш способ, спасибо.
mol4ok
Абдуллаев Рустам вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
каскадное удаление Skolot Microsoft Office Access 0 20.04.2009 11:12
модификация программы olla-la Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 10.05.2008 14:01
Каскадное удаление BustA SQL, базы данных 1 16.01.2008 10:31