Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2004.05.23;
Скачать: [xml.tar.bz2];

Вниз

триггер 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.051 c
11-1071471133
DSP
2003-12-15 09:52
2004.05.23
перемещение курсора в 1 позицию CheckBox


4-1080651544
BorH
2004-03-30 16:59
2004.05.23
Список Uninstall


1-1083956667
LAnd
2004-05-07 23:04
2004.05.23
Подсветка текста компоненты SynHighLighters (SynEdit, SynMemo)


14-1083499422
TUser
2004-05-02 16:03
2004.05.23
SetLength


14-1083533521
Blackgrin
2004-05-03 01:32
2004.05.23
Pocket PC





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский