powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / В одном триггере (Удалить+Обновить)
7 сообщений из 7, страница 1 из 1
В одном триггере (Удалить+Обновить)
    #32006634
Надежда
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нужно решить такую задачку: (сразу оговорюсь структуру базы разрабатывала не я и кординально перестроить ее не представлется возможным)

Есть таблица Документы, в ней хранится информация о бухгалтерских документах
Некоторые документы "завязаны" друг-на-друге, т.е. платежка имеет в дополнит. поле ссылку на ID счет-фактуры, в свою очередь счет-фактура в дополнит. поле ссылается на множество платежек. Эта связь "искусственна", т.е. доработана мной в пределах возможных настроек имееющейся ПО ("Акцент-бухгалтерия", Импакт, Донецк).

Если с вопросом "привязки" документов друг с другом - все решено и работает отлично, то проблема удаления документа из "связки" - никак не поддается.

Думала дописать имееющийся триггер на удаление (сейчас он содержит каскадное удаление из связанных таблиц), так не тут-то было - вместе с удалением одной строки (к примеру ведомой), нужно корректировать информацию дополнительного поля ведущей......

Что делать, как решить проблемку????
...
Рейтинг: 0 / 0
В одном триггере (Удалить+Обновить)
    #32006927
ChA+
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Из триггера можешь работать с базовой таблицей, как хочешь, то есть, удалить, добавить или изменить данные... Проблема может быть только в случае, если подобные изменения каскадно вызывая триггера превысят общий допустимый уровень вложенности
...
Рейтинг: 0 / 0
В одном триггере (Удалить+Обновить)
    #32006973
Надежда
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня получается такая ситуация (может слишком подробно, но по другому ни как не получится)
я пишу триггер на обработку удаления записи из таблицы DOCUMENTS, т.е. если из таблицы удаляется какая-то строка, то мне необходимо удалить ссылки на связанные с ней строки из других таблиц (используются команды типа DELETE DOC_TREE FROM deleted, DOC_TREE WHERE deleted.DOC_ID=DOC_TREE.ID).
Затем проверяю не является ли удаляемая запись "ведомой", т.е. нет ли в одном из дополнительных полей ссылки на ID "ведущей" записи.
Если удаляемая строка "ведомая", то мне необходимо откорректировать дополнительное поле "ведущей" записи в этой же таблице - я пишу в этом же триггере (он объявлен как FOR DELETE) такую строку
UPDATE DOCUMENTS SET DOCUMENTS.SP1="" WHERE DOCUMENTS.PV1=deleted.DOC_ID
при выполнении проверки на синтаксис Enterprise Manager выдает сообщение типа - вы не можете в этом триггере использовать таблицу DOCUMENTS
...
Рейтинг: 0 / 0
В одном триггере (Удалить+Обновить)
    #32006978
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
наверное вы очень волнуетесь и невнимательно пишите
UPDATE DOCUMENTS
SET SP1 =""
from DOCUMENTS s, deleted d

WHERE s.PV1=d.DOC_ID
...
Рейтинг: 0 / 0
В одном триггере (Удалить+Обновить)
    #32006992
Надежда
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
может и волнуюсь, но от этого проблемы не решаются.....

ведь deleted это и есть DOCUMENTS

Сейчас текст триггера выглядит так:

CREATE TRIGGER DOCUMENTS_DTrig ON dbo.DOCUMENTS FOR DELETE AS

DECLARE @ForLike varchar(100), @ForID int
SET @ForLike = ''

/* CASCADE DELETES TO 'DOC_PARAMS' */
DELETE DOC_PARAMS FROM deleted, DOC_PARAMS WHERE deleted.DOC_ID = DOC_PARAMS.DOC_ID

/* CASCADE DELETES TO 'DOC_TREE' */
DELETE DOC_TREE FROM deleted, DOC_TREE WHERE deleted.DOC_ID = DOC_TREE.ID

/*UPDATE TABLE*/
IF (left(deleted.DOC_PS1,4)='СФ №') and (deleted.DOC_PV1<>0)
IF deleted.PFM_ID=1
BEGIN
SET @ForLike = '%ПП №'+deleted.DOC_NO+'[[]'+cast(deleted.DOC_PV1 as varchar)+'];%'
SET @ForID=floor(deleted.DOC_PV1)
UPDATE DOCUMENTS SET DOC_PS1=replace(DOC_PS1,@ForLike,'') FROM DOCUMENTS s WHERE s.DOC_ID=@ForID
END

И Enterprise Manager выдает ошибку:
The column prefix 'deleted' does not match with a table name or alias name used in the query.
...
Рейтинг: 0 / 0
В одном триггере (Удалить+Обновить)
    #32006996
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
волнение достигло апогея

сначала всё правильно, а с этого места чуть не так

/*UPDATE TABLE*/
IF (( select left(DOC_PS1,4) from deleted) ='СФ №') and ( (select DOC_PV1 from deleted) <>0)
IF (select PFM_ID from deleted)=1
BEGIN
SELect @ForLike = '%ПП №'+DOC_NO+'[[]'+cast(DOC_PV1 as varchar)+'];%',
@ForID=floor(DOC_PV1) from deleted

а дальше опять нормально

кстати: Вы в курсе, что это всё будет работать при условии что удаляется только одна запись?

deleted - это таблица, а раз таблица, то чтобы читать её поля нужен обязательно FROM
...
Рейтинг: 0 / 0
В одном триггере (Удалить+Обновить)
    #32007083
Надежда
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Большое спасибо всем
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / В одном триггере (Удалить+Обновить)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]