Search Postgresql Archives

Re: Having a problem with my stored procedure

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



I tried doing two different triggers as you suggested but I kept getting
an error stating:

psql:archive_news_articles.sql:75: ERROR:  trigger "archive_articles"
for relation "news_content" already exists
psql:archive_news_articles.sql:80: ERROR:  trigger "update_archives" for
relation "news_content" already exists

So, I thought perhaps it couldn't be done.



Ted Byers wrote:
> Would it not be simpler to just create two trigger functions, one that
> acts on insert operations and a second that acts on update
> operations?  A 30 second glance at the Postgresql documentation showed
> me that it is possible to have more than one row level trigger for a
> given table, which implies the simpler options is possible.  This
> would make for a much simpler design and avoid a conditional block
> that would then be unnecessary.  This extra cost is, of course,
> trivial if only a handful of records are modified or created, but if
> the number is large, it could become significant.  Or is there
> something in how an RDBMS handles triggers that would make it
> preferable to have a single trigger for all possible operations on a
> record?  Something an old C++ programmer would miss if not informed
> about the peculiarities of database development.  Did I miss something
> critical?  My usual approach is to have functions remain as simple as
> practicable and do only one thing, unless there is a very good reason
> to have them more complex (in which a driver function that calls a
> number of simple functions may be preferable to one that tries to do
> everything).  Simple functions are easy to validate, and once
> validated make validation of more complex driver functions easier.
>  
> Why bother with so many temporaries?  Isn't that a waste of both
> development time (lots of extra typing and opportunity for errors such
> as typos) and runtime CPU cycles?  Why not just insert or update
> values directly from the NEW or OLD record into the target table
> rather than copying the values first into the temporaries and then
> from the temporaries into their final destination?
>  
> HTH
>  
> Ted
>
>     ----- Original Message -----
>     *From:* William Leite Araújo <mailto:william.bh@xxxxxxxxx>
>     *To:* Laura McCord <mailto:mccordl@xxxxxxxxxxxxxxxx>
>     *Cc:* pgsql-general@xxxxxxxxxxxxxx
>     <mailto:pgsql-general@xxxxxxxxxxxxxx>
>     *Sent:* Tuesday, February 13, 2007 12:19 PM
>     *Subject:* Re: [GENERAL] Having a problem with my stored procedure
>
>     2007/2/13, Laura McCord <mccordl@xxxxxxxxxxxxxxxx
>     <mailto:mccordl@xxxxxxxxxxxxxxxx>>:
>
>         To make a long story short, I am archiving data from an
>         original table
>         to a table I created. This is a third party web application
>         that I am
>         doing this with, so I can't revise the structure/code of this
>         application. With this said, if the original table goes
>         through an
>         insert or update action I want to replicate the information to my
>         archive table. I don't want to delete any articles from my archive
>         table so this is why I am not wanting to do anything based on
>         a delete
>         action.
>
>         The only problem that I am facing is how to tell the function
>         that I want to perform an update if an update occurred and an
>         insert if an insert action occurred. I want to have different
>         actions occur depending on if the trigger was based on an
>         insert or update.
>
>         Help, I've been stumped for two days.
>         Thanks in advance.
>
>         This is what I have so far:
>         CREATE TRIGGER archive_articles
>         AFTER INSERT OR UPDATE ON
>         news_content
>         EXECUTE PROCEDURE su_archive_articles();
>
>
>
>         CREATE OR REPLACE FUNCTION su_archive_articles()
>         RETURNS TRIGGER
>         LANGUAGE plpgsql
>         AS '
>         DECLARE
>         tmp_news_id CHARACTER varying(48);
>         tmp_title CHARACTER varying(100);
>         tmp_abstract CHARACTER varying(300);
>         tmp_news_story TEXT;
>         tmp_topic_id CHARACTER varying(10);
>         tmp_create_date DATE;
>         tmp_author CHARACTER varying(50);
>         tmp_begin_date DATE;
>         tmp_end_date DATE;
>         tmp_priority CHARACTER(1);
>         tmp_image_name CHARACTER varying(512);
>         tmp_image_mime_type CHARACTER varying(50);
>         tmp_layout_type CHARACTER varying(10);
>
>         BEGIN
>         SELECT INTO  tmp_news_id news_id from news_content where
>         last_inserted(news_id);
>         SELECT INTO  tmp_title title from news_content where
>         last_inserted(news_id);
>         SELECT INTO  tmp_abstract abstract from news_content where
>         last_inserted(news_id);
>         SELECT INTO  tmp_news_story news_story from news_content where
>         last_inserted(news_id);
>         SELECT INTO  tmp_topic_id topic_id from news_content where
>         last_inserted(news_id);
>         SELECT INTO  tmp_create_date create_date from news_content
>         where last_inserted(news_id);
>         SELECT INTO  tmp_author author from news_content where
>         last_inserted(news_id);
>         SELECT INTO  tmp_begin_date begin_date from news_content where
>         last_inserted(news_id);
>         SELECT INTO  tmp_end_date end_date from news_content where
>         last_inserted(news_id);
>         SELECT INTO  tmp_priority priority from news_content where
>         last_inserted(news_id);
>         SELECT INTO  tmp_image_name image_name from news_content where
>         last_inserted(news_id);
>         SELECT INTO  tmp_image_mime_type image_mime_type from
>         news_content where last_inserted(news_id);
>         SELECT INTO  tmp_layout_type layout_type from news_content
>         where last_inserted(news_id);
>
>
>        IF TG_OP = 'INSERT' THEN
>
>         //This is to be done if an INSERT action was done on the table
>
>         INSERT INTO su_archives(news_id, title, abstract, news_story,
>         topic_id, create_date, author, begin_date, end_date, priority,
>         image_name, image_mime_type, layout_type) VALUES
>         (tmp_news_id,tmp_title,tmp_abstract,tmp_news_story,tmp_topic_id,tmp_create_date,tmp_author,tmp_begin_date,tmp_end_date,tmp_priority,tmp_
>
>         image_name ,tmp_image_mime_type,tmp_layout_type);
>
>
>        ELSEIF  TG_OP = 'UPDATE' THEN
>
>         //HOW DO I TELL IT TO DO AN UPDATE ON THE ARCHIVE RECORD IF AN
>         UPDATE WAS DONE
>
>
>         END IF;
>
>         RETURN NEW;
>         END
>         ';
>
>         ---------------------------(end of
>         broadcast)---------------------------
>         TIP 4: Have you searched our list archives?
>
>                        http://archives.postgresql.org/
>         <http://archives.postgresql.org/>
>
>
>
>
>     -- 
>     William Leite Araújo
>     Analista de Banco de Dados - QualiConsult 
>


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Postgresql Jobs]     [Postgresql Admin]     [Postgresql Performance]     [Linux Clusters]     [PHP Home]     [PHP on Windows]     [Kernel Newbies]     [PHP Classes]     [PHP Books]     [PHP Databases]     [Postgresql & PHP]     [Yosemite]
  Powered by Linux