теряется триггер

fbguest
Дата: 17.05.2012 12:51:36
CREATE TABLE X (
    ID  INTEGER
);

CREATE OR ALTER TRIGGER T1 FOR X
ACTIVE BEFORE INSERT POSITION 0
AS
begin
end;

COMMIT WORK;

CREATE TABLE Y (
    ID  INTEGER
);

CREATE OR ALTER TRIGGER T1 FOR Y
ACTIVE BEFORE INSERT POSITION 0
AS
begin
end;

DROP TABLE X;

COMMIT WORK;

Ожидаемое поведение: создаётся таблица Y с триггером T1.
Реальное: создаётся таблица Y без триггера.

Похоже что при "DROP TABLE X" удаляется уже не принадлежащий X триггер T1.

Firebird 2.5.1
Ivan_Pisarevsky
Дата: 17.05.2012 12:54:39
а так:
CREATE TABLE X (
    ID  INTEGER
);
COMMIT;
CREATE OR ALTER TRIGGER T1 FOR X
ACTIVE BEFORE INSERT POSITION 0
AS
begin
end;

COMMIT WORK;

CREATE TABLE Y (
    ID  INTEGER
);
COMMIT;

CREATE OR ALTER TRIGGER T1 FOR Y
ACTIVE BEFORE INSERT POSITION 0
AS
begin
end;
COMMIT;

DROP TABLE X;

COMMIT WORK;
fbguest
Дата: 17.05.2012 13:05:57
И так теряется.
Таблоид
Дата: 17.05.2012 13:12:17
C:\MIX\firebird\fb25>ISQL
Use CONNECT or CREATE DATABASE to specify a database
SQL> CREATE DATABASE 'T1.FDB'; COMMIT;
SQL> CREATE TABLE X (ID INTEGER);
SQL> COMMIT;
SQL> CREATE OR ALTER TRIGGER T1 FOR X
CON> ACTIVE BEFORE INSERT POSITION 0
CON> AS
CON> begin
CON> end;
SQL> COMMIT;
SQL> EXIT;

C:\MIX\firebird\fb25>isql t1.fdb
Database: t1.fdb
SQL> CREATE TABLE Y (ID INTEGER);
SQL> COMMIT;
SQL> exit;

C:\MIX\firebird\fb25>isql t1.fdb
Database: t1.fdb
SQL> CREATE OR ALTER TRIGGER T1 FOR Y
CON> ACTIVE BEFORE INSERT POSITION 0
CON> AS
CON> begin
CON> end;
SQL> COMMIT;
SQL> EXIT;

C:\MIX\firebird\fb25>isql t1.fdb
Database: t1.fdb
SQL> show trigger;
Table name Trigger name Invalid
================================ ================================ =======
X T1
Триггер остался принадлежать таблице "X", а не "Y".
Команда его создания молча проигнорировала "for Y", хотя должна вроде была сказать своё "фэ"...
fbguest
Дата: 17.05.2012 13:24:45
Таблоид
Команда его создания молча проигнорировала "for Y", хотя должна вроде была сказать своё "фэ"...

"фэ" тут лишний :) Программист ожидает что запрос сделает ровно то, что в нём написано, и без fuzzy logic :)
dimitr
Дата: 17.05.2012 13:27:42
fbguest
"фэ" тут лишний :)

да неужели? Два триггера с одним именем в базе не допускаются.
dimitr
Дата: 17.05.2012 13:28:38
а если ты вдруг хочешь, чтобы ALTER TRIGGER позволял менять базовую таблицу триггера, то тоже в сад :-)
artemana
Дата: 17.05.2012 13:28:54
Таблоид
хотя должна вроде была сказать своё "фэ"...

Думаю что не обязательно.

Прикладной разработчик должен учитывать, что команд "alter trigger" в чистом виде не предполагает и запрещает использования "for", а в случае применения конструкции create or alter - "for" предназначен только для create, и alter игнорирует его. И вообще, "create or alter" - опасная штука.
hvlad
Дата: 17.05.2012 13:31:22
dimitr
а если ты вдруг хочешь, чтобы ALTER TRIGGER позволял менять базовую таблицу триггера, то тоже в сад :-)
Ну так посыл в сад должен быть явным и от сервера
dimitr
Дата: 17.05.2012 13:54:39
hvlad,

с этим я и не спорю :-) Примеру место в трекере.