Форум: "Базы";
Текущий архив: 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.043 c