Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.05.23;
Скачать: CL | DM;

Вниз

триггер Interbase -> триггер MSSQL 2000   Найти похожие ветки 

 
Mishel   (2004-04-28 10:06) [0]

Может кто подскажет как перевести триггер с 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 ?


 
Johnmen ©   (2004-04-28 10:08) [1]

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


 
Polevi ©   (2004-04-28 10:14) [2]

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


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

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


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

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
не проходит по синтаксису. Хочется по проще делать.


 
SWK   (2004-04-28 13:43) [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
Ничего не получается


 
Nikolay M. ©   (2004-04-28 19:43) [6]


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

DELETE FROM GRAF2, DELETED WHERE G2_KOD=DELETED.G1_NG


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

>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-29 08:54) [8]

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


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

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



Страницы: 1 вся ветка

Текущий архив: 2004.05.23;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.045 c
4-1081256565
Kme
2004-04-06 17:02
2004.05.23
Безвозвратное удаление


7-1081950964
Erik
2004-04-14 17:56
2004.05.23
Можноли скомпилоровать Delphi код на Windows CE?


14-1083704296
11111ffghfghfg
2004-05-05 00:58
2004.05.23
Зачем разработчики Делфи сделали TDAtaSource?


4-1081163464
Arturchik
2004-04-05 15:11
2004.05.23
Не хочет работать в OnShow(OnCreate): if Process32First(handler,d


14-1083688436
C_R_U_S_H
2004-05-04 20:33
2004.05.23
Приложение Ns.exe грузит центральный процессор на 100%