On Sun, 9 May 2004, Raymond Irving wrote: > >How about being able to add a trigger to the Database? > >CREATE TRIGGER db_inserts INSERT ON >DATABASE|{database_name} >BEGIN > .... >END
You'd want seperate update, create and insert triggers, as I believe you can only trigger on a table/view, not a generic database event. Docs: http://www.sqlite.org/lang.html#createtrigger More below. > >--- Chris Waters <[EMAIL PROTECTED]> >wrote: >> Hi, >> >> I need the ability to tell if changes have been made >> in the database. Kind >> of like the LISTEN capability in Postgresql. In >> particular I need to know >> if: >> >> * A row was inserted. >> * A row was deleted. >> * A row was modified. >> >> I would like to implement this through a callback >> that an application could >> register. The callback would specify the operation >> that was performed, the >> affected table and maybe the rowid affected. Create a function using sqlite_create_function() (Section 4.0 of http://www.sqlite.org/c_interface.html) and in the trigger body, call the function using select. To use a modified version of the docs example: CREATE TRIGGER update_customer_address UPDATE OF address ON customers BEGIN SELECT my_c_callback( old.name ) END; The my_c_callback function set up with sqlite_create_function() would be called with a single argument (the old name column, in this case) for each row updated. You'd want something similar for INSERT and DELETE. >> >> If the rowid is reported then for operations that >> affect a large number of >> rows there would be a performance penalty to call >> the callback per row. For >> my application this is not a problem, but perhaps >> when the callback is >> specified the application could indicate whether it >> wants per row, or per >> table notification. The is no trigger mechanism for per statement, only per row. So you'll have no choice. >> >> I am looking for ideas on where I should hook into >> the source code to add >> this functionality. From what I have seen so far it >> looks like I could >> change the implementation of the Delete and >> MakeRecord VM instructions to do >> the callback. Don't. Use sqlite_create_function(). >> >> I haven't thought through the timing implications >> yet. Ideally when a row is >> inserted, code in the callback could query the newly >> inserted row. I am not >> 100% sure at what point the row becomes visible for >> query. If you have the trigger as a pre-trigger, the database will appear to be before any modifications. Conversely, a post-trigger will have the updates applied in the current transaction. >> >> I would welcome any insight since this is my first >> attempt (of many I have >> lots of features I want :-) to modify the sqlite >> code. <recommendation> Don't make custom modifications unless they're are sufficiently generic enough for other uses. Else, you'll probably have to maintain a patch set against any future SQLite updates. >From your query, nothing you want to do cannot be done already using the existing generic mechanisms. </recommendation> >> >> Thanks, >> >> Chris. >> Christian -- /"\ \ / ASCII RIBBON CAMPAIGN - AGAINST HTML MAIL X - AGAINST MS ATTACHMENTS / \ --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]