Конференция "Базы" » MSSQL 2005 [D7, MSSQL]
 
  • AlexAl-77 (08.05.08 19:17) [0]
    Недостаточное или неполные сведения о ключевом поле. Обновление влияет на слишком большое число строк.

    Вот это сообщение мне пишит когда я хочу удалить детей при удалении родителя. Ругается тока тогда когда детей больше одного.

    Удаляю я с помощью триггера на событие delete  уродителя
    CREATE TRIGGER trg_SotrDelete ON dbo.sotr

    AFTER DELETE
    AS

    declare @id int
    Select @id = id_sotr from deleted

    if (select count(*) from dok where dok.id_s_dok = @id)>0
    begin
    DELETE FROM dok WHERE dok.id_s_dok = @id
    end

    if (select count(*) from otpusk where otpusk.id_s_otpusk = @id)>0
    begin
    DELETE FROM otpusk WHERE otpusk.id_s_otpusk = @id
    end

    Не подскажете как с этим бороться
  • Johnmen © (08.05.08 19:23) [1]
    Зачем вообще вся это смешная байда, если есть обычное поддержание ссылочной целостности с каскадными воздействиями???
  • sniknik © (08.05.08 20:31) [2]
    > Зачем вообще вся это смешная байда
    +1

    > Не подскажете как с этим бороться
    убрать все, и сделать нормально.

    по вопросу.
    в коде не восстанавливается @@identity, а по нему потом дельфи(ado? неважно) определяет на сколько записей произошло воздействие... естественно при ожидаемом 1-м удалении получив что удалилось десяток (пусть это не так, но видимость этого есть) возбуждается исключение.
  • sniknik © (08.05.08 20:33) [3]
    > не восстанавливается @@identity
    блин, думаю одно пишу другое, надо - @@rowcount
  • AlexAl-77 (11.05.08 12:06) [4]

    > Зачем вообще вся это смешная байда, если есть обычное поддержание
    > ссылочной целостности с каскадными воздействиями???

    Прошу подсказать как это сделать. Спасибо за ответы
  • AlexAl-77 (11.05.08 12:15) [5]
    Если при создании диограммы это надо делать то у меня получилось. Спасибо
  • sniknik © (11.05.08 12:38) [6]
    не обязательно (я вообще не часто например диаграммы делаю... раз или два за все время), можно еще в "десигне" таблици, правой кнопкой на поле, выбрать "релатионсшипс". впрочем. из диаграмм та же форма настроек вызывается.
  • ANB (12.05.08 10:12) [7]

    > Select @id = id_sotr from deleted

    Довольно распространенная ошибка, живущая даже в родных книжках от МС.

    deleted - это набор данных. Следовательно, код триггера будет неработоспособен, если пытаться удалить несколько записей одним delete.

    А ошибку тебе АДО вертает.
    Выходы :
    1) каскадный внешний ключ (тут внешний ключ и без каскада не помешает), тогда триггер просто выкинуть.
    2) удалять напрямую через SQL, а не методом delete. Тогда триггер мона оставить. Но его все равно придется переписывать, т.к. кривой.

    ИМХА - я за первый способ.
 
Конференция "Базы" » MSSQL 2005 [D7, MSSQL]
Есть новые Нет новых   [134433   +22][b:0][p:0]