Обсуждение: Delete triggers
I have had a lot of trouble getting a DELETE trigger to do nothing (ie let =
the delete operation occur instead of cancelling it, as required)
The documentation on this is very thin on the ground - I`ve just spend 4 Ho=
urs googling and the best I could find was one of the main developers (Bruc=
e?? sorry - too long ago) replying to an email in 2001. Which was to NOT=
cancel the delete operation, you need to return NEW or OLD.
- If I return NULL the operation is cancelled. ("DELETE 0")
- If I return NEW the operation is cancelled. ("DELETE 0") Now NEW is not=
set for a delete (because it would make no sense) so I am thinking this is=
the same as returning NULL
- If I return OLD the operation is cancelled ("DELETE 0").
I am using the 7.2 version.
To me this is either a bug in the system, or a 'bug' in the documentation. =
Look forward to hearing from you.
Cheers,
Mathew
"Mathew Frank" <mathewfrank@qushi.com> writes:
> The documentation on this is very thin on the ground - I`ve just spend 4 Ho=
> urs googling and the best I could find was one of the main developers (Bruc=
> e?? sorry - too long ago) replying to an email in 2001. Which was to NOT=
> cancel the delete operation, you need to return NEW or OLD.
There is no NEW row in a delete trigger. RETURN OLD should work.
> - If I return OLD the operation is cancelled ("DELETE 0").
I suspect pilot error.
regards, tom lane
> "Mathew Frank" <mathewfrank@qushi.com> writes:
> > The documentation on this is very thin on the ground - I`ve just spend 4
Ho=
> > urs googling and the best I could find was one of the main developers
(Bruc=
> > e?? sorry - too long ago) replying to an email in 2001. Which was to
NOT=
> > cancel the delete operation, you need to return NEW or OLD.
>
> There is no NEW row in a delete trigger.
Actually I think I just said that ;-)
> RETURN OLD should work.
> > - If I return OLD the operation is cancelled ("DELETE 0").
>
> I suspect pilot error.
Fair enough. Here is my test code (apologies - should have sent it the
first time):
-----
CREATE FUNCTION "trg_test"() RETURNS "opaque" AS '
DECLARE
is_closed bool;
result record;
BEGIN
is_closed := false;
IF is_closed THEN
RAISE NOTICE ''Operation Cancelled: Month has been closed'';
return NULL;
ELSE
IF ( TG_OP = ''DELETE'' ) THEN
RAISE NOTICE ''Operation NOT cancelled'';
return OLD;
ELSE
RAISE NOTICE ''Operation NOT cancelled - NOT delete'';
return NEW;
END IF;
END IF;
END;
' LANGUAGE 'plpgsql';
drop trigger "protectperiod_montly_figures" on monthly_figures;
CREATE TRIGGER "protectperiod_montly_figures" BEFORE INSERT OR DELETE OR
UPDATE ON "monthly_figures" FOR EACH ROW EXECUTE PROCEDURE trg_test();
-----
and the result of a delete query:
NOTICE: Operation NOT cancelled
ERROR: fmgr_info: function 1455898: cache lookup failed
(I was sure I was getting a 'Delete 0' but since my computer has crashed
since - I`m not sure. Maybe I was getting the above)
Now before you ask - the trigger was created after the trigger function.
I don`t see what can be wrong with the above - my code does not touch OLD -
merely returns it.
Cheers,
Mathew
ps - if you think I should move this to users I will, though at this point I
don`t see a code issue (I hope you do though)
"Mathew Frank" <mathewfrank@qushi.com> writes:
> and the result of a delete query:
> NOTICE: Operation NOT cancelled
> ERROR: fmgr_info: function 1455898: cache lookup failed
> (I was sure I was getting a 'Delete 0' but since my computer has crashed
> since - I`m not sure. Maybe I was getting the above)
> Now before you ask - the trigger was created after the trigger function.
That trigger, maybe, but the fmgr_info failure clearly indicates a
dangling function reference somewhere. Maybe you have other triggers
defined on this table?
Could I interest you in upgrading to 7.3? It's supposed to prevent you
from dropping things that still have references to 'em ...
regards, tom lane