Re: [GENERAL] regarding triggers

2006-01-12 Thread surabhi.ahuja
Title: RE: [GENERAL] regarding triggers 







but if i have on delete cascade constraint,
in that case if i have a trigger which is fired in case delet happens on the table y.

i have a table x, and table y has a foreign key with on delete cascade constraint,

now i delete a row from x, will the trigger still be called?

-Original Message-
From: Tom Lane [mailto:[EMAIL PROTECTED]]
Sent: Tue 1/10/2006 9:58 PM
To: John McCawley
Cc: surabhi.ahuja; pgsql-general@postgresql.org
Subject: Re: [GENERAL] regarding triggers

***
Your mail has been scanned by iiitb VirusWall.
***-***


John McCawley [EMAIL PROTECTED] writes:
 Foreign keys do not cascade deletions.

By default, no, but there is the CASCADE option ...

   regards, tom lane









Re: [GENERAL] regarding triggers

2006-01-12 Thread John McCawley


surabhi.ahuja wrote:



but if i have on delete cascade constraint,
in that case if i have a trigger which is fired in case delet happens 
on the table y.


i have a table x, and table y has a foreign key with  on delete 
cascade constraint,


now i delete a row from x, will the trigger still be called?

I just did a test, and it does.  See below (note my serial_id on the log 
table is incremented from earlier testing)



create table tbl_foo ( foo_id SERIAL PRIMARY KEY, stuff varchar(32) );

create table tbl_bar ( bar_id SERIAL PRIMARY KEY, foo_id integer, 
barstuff varchar(32) );


create table tbl_log ( log_id SERIAL PRIMARY KEY, stuff varchar(32) );

ALTER TABLE tbl_bar ADD CONSTRAINT fk_tbl_bar_tbl_foo_foo_id FOREIGN KEY 
(foo_id) REFERENCES tbl_foo(foo_id) MATCH FULL ON DELETE CASCADE;



CREATE FUNCTION sp_logdelete() RETURNS trigger AS '
DECLARE
BEGIN
INSERT INTO tbl_log (stuff) VALUES (\'Trigger was called!\');
return OLD;
END;
' LANGUAGE 'plpgsql';

CREATE TRIGGER bar_delete_trigger BEFORE DELETE ON tbl_bar FOR EACH ROW 
EXECUTE PROCEDURE sp_logdelete();



INSERT INTO tbl_foo (stuff) VALUES ('this is stuff');

select * FROM tbl_foo;
foo_id | stuff
+---
 1 | this is stuff
(1 row)


insert into tbl_bar (foo_id, barstuff) VALUES (1, 'bar stuff');

select * FROM tbl_log;

log_id | stuff
+---
(0 rows)


delete from tbl_foo;

DELETE 1

SELECT * FROM tbl_log;

log_id |stuff
+-
 5 | Trigger was called!
(1 row)

SELECT * FROM tbl_bar;
bar_id | foo_id | barstuff
++--
(0 rows)



---(end of broadcast)---
TIP 1: if posting/reading through Usenet, please send an appropriate
  subscribe-nomail command to [EMAIL PROTECTED] so that your
  message can get through to the mailing list cleanly


[GENERAL] regarding triggers

2006-01-10 Thread surabhi.ahuja
Title: regarding triggers






is there an advantage of using a trigger? when the same job can be performed by a stored procedure?

one more question is as follows:
suppose i have a table x, with a primary attribute 'a'

and i have a table y, with the primary attribute 'b', and a foreign key 'a'.

suppose i say delete from x where a = '1',

it means that not only the rows from x get deleted but also rows from y get deleted.

now i have a trigger which is written for deletes taking place from the table y.

however if i say delete from x where a = '1',

will the trigger (mentioned above) still be called? (because delete are also taking place from the table y)

thanks,
regards
Surabhi





Re: [GENERAL] regarding triggers

2006-01-10 Thread John McCawley
Foreign keys do not cascade deletions.  If table y references table x on 
column a, the attempt to delete records in x with dependent records in y 
will yield an error.  So the answer to that question is no, your trigger 
won't get called because a) y doesn't get touched because that's not 
what foreign keys do and b) an error is raised anyway


Regarding the usefulness of triggers...I tend to stay away from them.  I 
like to keep my data in my database and my logic in my application.  I 
try to relegate triggers to very simple things like timestamping 
records.  i.e. things that I won't later wonder What in the hell is 
going on???




surabhi.ahuja wrote:

is there an advantage of using a trigger? when the same job can be 
performed by a stored procedure?


one more question is as follows:
suppose i have a table x, with a primary attribute 'a'

and i have a table y, with the primary attribute 'b', and a foreign 
key 'a'.


suppose i say delete from x where a = '1',

it means that not only the rows from x get deleted but also rows from 
y get deleted.


now i have a trigger which is written for deletes taking place from 
the table y.


however if i say delete from x where a = '1',

will the trigger (mentioned above) still be called? (because delete 
are also taking place from the table y)


thanks,
regards
Surabhi



---(end of broadcast)---
TIP 2: Don't 'kill -9' the postmaster


Re: [GENERAL] regarding triggers

2006-01-10 Thread Jaime Casanova
On 1/10/06, surabhi.ahuja [EMAIL PROTECTED] wrote:


 is there an advantage of using a trigger? when the same job can be performed
 by a stored procedure?


a trigger is actually a stored procedure... the advantage is that it's
called automagically when an event happens...

 one more question is as follows:
 suppose i have a table x, with a primary attribute 'a'

 and i have a table y, with the primary attribute 'b', and a foreign key 'a'.

 suppose i say delete from x where a = '1',

 it means that not only the rows from x get deleted but also rows from y get
 deleted.


only if you specified ON DELETE CASCADE at FOREIGN KEY creation

 now i have a trigger which is written for deletes taking place from the
 table y.

 however if i say delete from x where a = '1',

 will the trigger (mentioned above) still be called? (because delete are also
 taking place from the table y)


if the DELETE will CASCADE, yes

 thanks,
 regards
 Surabhi


--
regards,
Jaime Casanova
(DBA: DataBase Aniquilator ;)

---(end of broadcast)---
TIP 4: Have you searched our list archives?

   http://archives.postgresql.org


Re: [GENERAL] regarding triggers

2006-01-10 Thread Jaime Casanova
On 1/10/06, Jaime Casanova [EMAIL PROTECTED] wrote:
 On 1/10/06, surabhi.ahuja [EMAIL PROTECTED] wrote:
 
 
  is there an advantage of using a trigger? when the same job can be performed
  by a stored procedure?
 


a trigger is actually a stored procedure... the advantage is that it's
called automagically when an event happens...


  one more question is as follows:
  suppose i have a table x, with a primary attribute 'a'
 
  and i have a table y, with the primary attribute 'b', and a foreign key 'a'.
 
  suppose i say delete from x where a = '1',
 
  it means that not only the rows from x get deleted but also rows from y get
  deleted.
 


only if you specified ON DELETE CASCADE at FOREIGN KEY creation

  now i have a trigger which is written for deletes taking place from the
  table y.
 
  however if i say delete from x where a = '1',
 
  will the trigger (mentioned above) still be called? (because delete are also
  taking place from the table y)
 


if the DELETE will CASCADE, yes

  thanks,
  regards
  Surabhi



--
regards,
Jaime Casanova
(DBA: DataBase Aniquilator ;)

---(end of broadcast)---
TIP 2: Don't 'kill -9' the postmaster


Re: [GENERAL] regarding triggers

2006-01-10 Thread Guy Rouillier
John McCawley wrote:
 Foreign keys do not cascade deletions.

They will if you specify on delete cascade.

-- 
Guy Rouillier


---(end of broadcast)---
TIP 1: if posting/reading through Usenet, please send an appropriate
   subscribe-nomail command to [EMAIL PROTECTED] so that your
   message can get through to the mailing list cleanly


Re: [GENERAL] regarding triggers

2006-01-10 Thread Tom Lane
John McCawley [EMAIL PROTECTED] writes:
 Foreign keys do not cascade deletions.

By default, no, but there is the CASCADE option ...

regards, tom lane

---(end of broadcast)---
TIP 9: In versions below 8.0, the planner will ignore your desire to
   choose an index scan if your joining column's datatypes do not
   match


Re: [GENERAL] regarding triggers

2006-01-10 Thread Harry Jackson
On 1/10/06, John McCawley [EMAIL PROTECTED] wrote:
 Regarding the usefulness of triggers...I tend to stay away from them.  I
 like to keep my data in my database and my logic in my application.  I
 try to relegate triggers to very simple things like timestamping
 records.  i.e. things that I won't later wonder What in the hell is
 going on???

I always try to get all the relationships from the data into the
database using whatever the database can do ie triggers, foriegn keys,
check constraints etc. I find that leaving all the logic to the
application is a disaster waiting to happen particularly when the
application is being developed by lots of people.

If you insist in having all the logic in the application then surely
you could use triggers to make sure that if the application makes a
cock up then the integrity of the data won't be compromised. I know
you can use begin;  commit; from the application but when working
with other developers there are no guarantees that they will always be
using them or more likely a mistake will be made by me or someone else
and I want the database to handle it.

--
Harry
http://www.hjackson.org
http://www.uklug.co.uk

---(end of broadcast)---
TIP 3: Have you checked our extensive FAQ?

   http://www.postgresql.org/docs/faq