![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
триггер 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) с каскадным удалением. И не париться...:)