Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

триггер Interbase -> триггер MSSQL 2000 [D7, IB5.x, MSSQL]


Mishel ©   (2004-04-28 10:06:00) 

Может кто подскажет как перевести триггер с Interbase на MSSQL 2000.

Перевожу базу с Interbase на MSSQL получился затык с триггерами.
На Interbase выглядит (связка GRAF1.G1_NG -> GRAF2.G2_KOD):

CREATE TRIGGER DELETE_GRAF FOR GRAF1                          
ACTIVE BEFORE DELETE POSITION 0
AS BEGIN
       DELETE FROM GRAF2
       WHERE GRAF2.G2_KOD=Old.G1_NG;
END

Понял, что в MSSQL есть замечательная вещь Relatioships с каскадным
обновлением и удалением таблиц. Только чтобы не проставлять (пока)
по всем таблицам связи хотел оставить все на триггерах, как было.
И тут что-то с синтаксисом недопонимаю с MSSQL

Варианты
1.
CREATE TRIGGER DELETE_GRAF ON GRAF1
FOR DELETE
AS
  DELETE FROM GRAF2 WHERE GRAF2.G2_KOD=GRAF1.G1_NG;
Ош. при проверке систаксиса  - неизвестный алиас GRAF1

2. Варианты
  DELETE FROM GRAF2 WHERE GRAF2.G2_KOD=G1_NG;
  DELETE FROM GRAF2 WHERE GRAF2.G2_KOD=DELETED.G1_NG;
Тоже синтаксис не проходит

3.
CREATE TRIGGER DELETE_GRAF ON GRAF1
FOR DELETE
AS
DELETE FROM GRAF2
WHERE GRAF2.G2_KOD IN (SELECT G1_NG FROM DELETED)
   
Проходит по синтаксису, но в проекте дает ошибку неоднозначности
при прорисовке данных (в базе в итоге вообще ничего не удаляется).

Чую, что ответ где-то рядом.

Попутно - есть ли и MSSQL аналог CREATE EXCEPTION ?


Mishel   (2004-04-29 09:17:00) [1]

>for Nikolay M.
Спасибо. Действительно заработало и удаляется все верно.
Хотя специально попробовал эту конструкцию для Interbase - не катит. Разный систаксис в командах DELETE.


Nikolay M.   (2004-04-29 08:54:00) [2]

DELETE GRAF2
FROM GRAF2 AS g, DELETED AS d
WHERE g.G2_KOD = d.G1_NG


Mishel   (2004-04-29 08:44:00) [3]

>for Nikolay M.
>DELETE FROM GRAF2, DELETED WHERE G2_KOD=DELETED.G1_NG

Ругается на синтаксис после запятай (вообще то я думал, что в DELETE FROM можно указывать только одно имя объекта).

интересно, что в триггере на обновление данных
CREATE TRIGGER UPDATE_PERSONS ON PERSONS
FOR UPDATE
AS SET NOCOUNT ON
  IF UPDATE(PE_PN)
  BEGIN
   UPDATE BOL SET BOL.PE_PN=PE_PN FROM UPDATED WHERE BOL.PE_PN=DELETED.PE_PN;
  END

Указываю WHERE BOL.PE_PN=DELETED.PE_PN (конструкция проходит)
что вроде аналогично попытке в триггере на удаление
DELETE FROM GRAF2 WHERE G2_KOD=DELETED.G1_NG

Так в чем разница?


Nikolay M.   (2004-04-28 19:43:00) [4]


> DELETE FROM GRAF2 WHERE G2_KOD=DELETED.G1_NG
> не проходит по синтаксису. Хочется по проще делать.

DELETE FROM GRAF2 , DELETEDWHERE G2_KOD=DELETED.G1_NG


SWK   (2004-04-28 13:43:00) [5]

Может быть кто поможет перевести триггер с ORACLE на MS SQL 2000.
CREATE OR REPLACE TRIGGER AR_BD
  BEFORE DELETE ON AP
  FOR EACH ROW
BEGIN
  DELETE RROM APM WHERE FID_AP = :OLD.ID;
END AP_BD
Ничего не получается


Mishel   (2004-04-28 10:33:00) [6]

for Polevi
Спасибо. С SET NOCOUNT ON действительно все поехало.
Только странно - обязательно городить огород с SELECT
DELETE FROM GRAF2 WHERE G2_KOD IN (SELECT G1_NG FROM DELETED)
а
DELETE FROM GRAF2 WHERE G2_KOD=DELETED.G1_NG
не проходит по синтаксису. Хочется по проще делать.


Mishel   (2004-04-28 10:19:00) [7]

for Johnmen
Это верно, проверял, отлично работает. Тут уже дело принципа - охота добить и разобраться с триггерами. В принципе ведь не возбраняется написать на триггерах?


Polevi   (2004-04-28 10:14:00) [8]

CREATE TRIGGER DELETE_GRAF ON GRAF1
FOR DELETE
AS
SET NOCOUNT ON -- настоятельно рекомендую писать это в начале любого триггера или хранимой процедуры
DELETE FROM GRAF2 WHERE G2_KOD IN (SELECT G1_NG FROM DELETED)

см RAISERROR


Johnmen   (2004-04-28 10:08:00) [9]

Сделать нормальный ссылочный ключ (FK) с каскадным удалением. И не париться...:)


Наверх

Титульная страница Поиск, карта сайта Написать письмо