After Commit Trigger
Does Oracle have an trigger that will fire only after you have issued a commit on an insert and/or update?
What is INSERT ALL lacking in your case?An interesting suggestion CD. What I would like to do is this ...
INSERT INTO master (id, col1, col2) VALUES (pk_seq.nextval, 'APC', sysdate)
INTO child (id, fk_col, col23, col25) VALUES (ano_seq.nextval, pk_seq.currval, 'Tooting', 'London')
/as a single statement that doesn't require deferred constraints.
So yes I can frig INSERT ALL to do something similar but the syntax must be in the format INSERT ALL INTO ... SELECT ... FROM .
SQL> INSERT ALL
2 INTO master (id, col1, col2)
3 VALUES (pk_seq.nextval, 'APC', sysdate)
4 INTO child (id, fk_col, col23, col25)
5 VALUES (ano_seq.nextval, pk_seq.currval, 'Tooting', 'London')
6 SELECT * FROM dual
7 /
2 rows created.
SQL> select * from master
2 /
ID COL1 COL2
5 APC 08-NOV-06
SQL> select * from child
2 /
ID FK_COL COL23 COL25
5 5 Tooting London
SQL> Cheers, APC
Similar Messages
-
Navigating to a tab page after a show_window() in on-commit trigger
I have a multi-tab form. On-commit, the form checks for warnings. When there is one or more warnings it opens a window to list them. With or without warning messages, the data is committed with commit_form.
Whenever window with warning messages is displayed, the form always returns to the top-most tab. Otherwise tab page is not changed.
In the on-commit trigger I save the tab page and then call set_canvas_property() after show_window() to restore the tab page. For some reason, the first tab page is always on top even though the the tab page name I saved is correct. I can't use go_block() in the on-commit trigger.
Are there other ways to restore a tab page on-commit?Hi claytonfan
Are there other ways to restore a tab page on-commit? Try the following code in the WHEN-TAB-PAGE-CHANGED OR On-commit trigger.
IF GET_CANVAS_PROPERTY('tab_canvas_name', TOPMOST_TAB_PAGE) = 'first_tab_name' THEN
GO_BLOCK('BLOCK_NAME');
--write ur code--
ELSIF GET_CANVAS_PROPERTY('tab_canvas_name', TOPMOST_TAB_PAGE) = 'second_tab_name' THEN
--write ur code--
END IF;Hope this helps...
Regards,
Amatu Allah -
Using Database Change Notification instead of After Insert Trigger
Hello guys! I have an after insert trigger that calls a procedure, which in turn is doing an update or insert on another table. Due to mutating table errors I declared the trigger and procedure as autonomously transactional. The problem is, that old values of my main tables are inserted into the subtable since the after insert/update trigger is fired before the commit.
My question is how can I solve that and how could I use the change notification package to call my procedure? I now that this notification is only started after a DML/DDL action has been commited on a table.
If you could show me how to carry out the following code with a Database Change Notification I'd be delighted. Furthermore I need to know if it suffices to set up this notification only once or for each client seperately?
Many thanks for your help and expertise!
Regards,
Sebastian
declare
cnumber number (6);
begin
select count(*) into cnumber from (
select case when (select date_datum
from
(select f.date_datum,
row_number() over (order by f.objectid desc) rn
from borki.fangzahlen f
where lng_falle = :new.lng_falle
and int_fallennummer = :new.int_fallennummer
and lng_schaedling = :new.lng_schaedling
and date_datum > '31.03.2010'
where rn=1) < (select date_datum
from
(select f.date_datum,
row_number() over (order by f.objectid desc) rn
from borki.fangzahlen f
where lng_falle = :new.lng_falle
and int_fallennummer = :new.int_fallennummer
and lng_schaedling = :new.lng_schaedling
and date_datum > '31.03.2010'
where rn=2) then 1 end as action from borki.fangzahlen
where lng_falle = :new.lng_falle
and int_fallennummer = :new.int_fallennummer
and lng_schaedling = :new.lng_schaedling
and date_datum > '31.03.2010') where action = 1;
if cnumber != 0 then
delete from borki.tbl_test where lng_falle = :new.lng_falle
and int_fallennummer = :new.int_fallennummer
and lng_schaedling = :new.lng_schaedling
and date_datum > '31.03.2010';
commit;
pr_fangzahlen_tw_sync_sk(:new.lng_falle, :new.int_fallennummer, :new.lng_schaedling);It looks like you have an error in line 37 of your code. Once you fix that the problem should be resolved.
-
Use of "DBA_OBJECTS" in "AFTER CREATE" Trigger
Hi,
We would like to store some extra information about our objects we have in the database. To do so we tought of the idea of creating a 'documenting' table containing an object_id that references to the object_id from the view dba_views.
Now we want to automatically create a new record in our documenting table when a new object is created, in the first stage this should only contain the object_id
To accomplish this we are using an 'AFTER CREATE' trigger, but when this trigger fires and the code searches for the new object_id in dba_objects, it does not return any records and generates an error. Likely because when the trigger is executed, the view is not yet updated?
create or replace
TRIGGER TRG_TEST
AFTER CREATE ON SCOTT.SCHEMA
DECLARE
tmp VARCHAR2(50);
BEGIN
dbms_output.put_line(ora_dict_obj_name);
select object_id
into tmp
from dba_objects
where object_name = ora_dict_obj_name;
dbms_output.put_line(tmp);
END;
Error report:
ORA-04088: Fout bij uitvoering van trigger 'SCOTT.TRG_TEST'.
ORA-01403: Geen gegevens gevonden.
ORA-06512: in regel 6
04088. 00000 - "error during execution of trigger '%s.%s'"
*Cause: A runtime error occurred during execution of a trigger.
*Action: Check the triggers which were involved in the operation.
It's in dutch, so I'll have a go at translating:
Error report:
ORA-04088: Exception while executing trigger 'SCOTT.TRG_TEST'.
ORA-01403: No data found
ORA-06512: in rule 6
04088. 00000 - "error during execution of trigger '%s.%s'"
*Cause: A runtime error occurred during execution of a trigger.
*Action: Check the triggers which were involved in the operation.
Does anyone have an idea of how I can accomplish what I'm trying to do here.. Or maybe something I'm doing wrong?
Thanks in advance!
DavyWhat is "ora_dict_obj_name" defined as?
Another option might be to setup a DBMS_SCHEDULER job to run the following insert
firstly though, create the following table ;
create document_table as (select * from dba_objects where rownum < 1)and then setup a DBMS_SCHEDULER job to run the following:
begin
insert into document_table
(select dbo.*
from dba_objects dbo
,document_Table dtb
where dbo.Object_ID = dtb.Object_ID(+)
and dtb.Object_ID is null);
commit;
exception
when others then
rollback;
-- log a message somewhere with the error, i.e. SQLERRM
end;
/Note, I specified all columns, but you'll probably specify explicitly which column you require, in which case the CREATE table would change as well.
Then you won't have a need for any trigger, and can better manage when you want your documentation to be updated.
Another option might be to use COMMENT, which can be used on tables, views, materialized views, but won't cover all objects
to the extent you might want.
SQL> desc emp2
Name
EMPNO
JOB
START_DATE
SAL
DEPT
END_DATE
SQL> comment on column emp2.sal is 'Existing Salary of employee as paid at most recent month end'; -
Hello all,
I have a question about after insert trigger. Will be new row inserted and commited if after insert trigger returns error? Thank you.
regards,
MihaWhat is the error that u r facing?
there could multiple reasons for that. Basically, u can't put commit in the trigger (unless it is an autonomous transaction). Share the pseudo-code of u r triiger, so that , problem can be identified.
Cheers,
Ram Kanala -
:NEW cannot be used in After Delete Trigger ?
Hi,
Is there any way to get the :NW.value in the After delete trigger for each row. My requirement is audit log of the end user DML operations along with user Name (HERE THE USER IS NOT THE ORACLE USER, BECAUSE OF THE LARGE NUMBER OF END USERS WE ARE MAINTAINING ONE TABLE TO CREATE USER NAME & PASSWORD, WHEN THE USER LOGIN TO ORACLE FORM SCREEN, ASSIGN THE USER NAME TO GLOBAL VARIABLE) & Action Date.
Here is my code for trigger - It is working fine with INSER & UPDATE but for DELETE User is NULL
CREATE OR REPLACE TRIGGER Tgr_stud_det
AFTER INSERT OR UPDATE OR DELETE ON student_details
FOR EACH ROW
DECLARE
BEGIN
IF Inserting THEN
-------------INSERT VALUE---------------
INSERT INTO Log_student_details
(Seq,
App_User,
Action,
Action_Date,
stud_name,
stud_age,
stud_sex)
VALUES
(stud_sequence.NEXTVAL,
:NEW.App_User,
'INSERT',
SYSDATE,
:NEW.stud_name,
:NEW.stud_age,
:NEW.stud_sex);
-------------DELETE VALUE---------------
ELSIF Deleting THEN
INSERT INTO Log_student_details
(Seq,
App_User,
Action,
Action_Date,
Comment_Up,
stud_name,
stud_age,
stud_sex)
VALUES
(stud_sequence.NEXTVAL,
:OLD.App_User,
'DELETE',
SYSDATE,
NULL,
:OLD.stud_name,
:OLD.stud_age,
:OLD.stud_sex);
ELSIF Updating THEN
-------------UPDATE VALUE---------------
INSERT INTO Log_student_details
(Seq,
App_User,
Action,
Action_Date,
Comment_Up,
stud_name,
stud_age,
stud_sex)
VALUES
(stud_sequence.NEXTVAL,
:NEW.App_User,
'UPDATE',
SYSDATE,
'NEW VALUE',
:NEW.stud_name,
:NEW.stud_age,
:NEW.stud_sex);
INSERT INTO Log_student_details
(Seq,
App_User,
Action,
Action_Date,
Comment_Up,
stud_name,
stud_age,
stud_sex)
VALUES
(stud_sequence.CURRVAL,
:NEW.App_User,
'UPDATE',
SYSDATE,
'OLD VALUE',
:OLD.stud_name,
:OLD.stud_age,
:OLD.stud_sex);
END IF;
EXCEPTION
WHEN OTHERS THEN
NULL;
END Tgr_stud_det;
Thanks in advance.Rizly,
As i mentioned in the above post, you should remove the references of :old and :new when you are trying to use the global variables. These values are only significant when you the talk about the record in the table.
For the scenario, you explained, your trigger would insert two records....The trigger would be fired twice.. once during the insert and once during the delete. The audit table will have two records indicating both the actions..
Take a look at this example below...I am artificially manufacturing a user id in the package test_pkg and using that in the insert trigger. As i explained above, you dont need the :old and :new references because the user id is not a column in the table . hence the :old and :new references have no relevance.
Also note that, for the delete, I use the :old value and for the insert, I use the :new value.
for update, I assume you want to store the old record and hence used :old (you can of course use :new too..technically.).
I don't have access to a forms environement, but the user id logic should be similar to what I described below.
sql> create table t(
2 id number,
3 name varchar2(20)
4 );
Table created.
sql> create table t_audit
2 ( id number,
3 name varchar2(20),
4 action varchar2(20),
5 user_id varchar2(20)
6 );
Table created.
sql> create or replace package test_pkg as
2 function get_user_id return varchar2;
3 end test_pkg;
4 /
Package created.
sql> create or replace package body test_pkg as
2 function get_user_id return varchar2 is
3 begin
4 return 'USER' || to_char(sysdate,'HH24:MI');
5 end get_user_id;
6 end test_pkg;
7 /
Package body created.
1 create or replace trigger trg_biud_t
2 before insert or update or delete on t
3 for each row
4 begin
5 if INSERTING then
6 insert into t_audit values (:new.id, :new.name, 'INSERT',test_pkg.get_user_i
7 elsif UPDATING then
8 insert into t_audit values (:old.id, :old.name, 'UPDATE',test_pkg.get_user_i
9 elsif DELETING then
10 insert into t_audit values (:old.id, :old.name, 'DELETE',test_pkg.get_user_i
11 end if;
12* end;
sql> /
Trigger created.
sql> select * from t;
no rows selected
sql> select * from t_audit;
no rows selected
sql> insert into t values (100, 'Rajesh');
1 row created.
sql> insert into t values (200,'Kumar');
1 row created.
sql> delete from t where id = 200;
1 row deleted.
sql> commit;
Commit complete.
sql> select * from t
2 /
ID NAME
100 Rajesh
sql> select * from t_audit;
ID NAME ACTION USER_ID
100 Rajesh INSERT USER15:36
200 Kumar INSERT USER15:36
200 Kumar DELETE USER15:37 -
Problem in writing 'After Report trigger'
Hi All,
Iam trying to insert values into database table after running the report.
but the values are not inserted into the table.
Here is the code in 'After Report trigger'
function AfterReport return boolean is
begin
insert into reports_log values('poorders',user,sysdate,'Y');
commit;
return (TRUE);
end;
Thanks in AdvanceTested one of my reports and found:
the After Report Trigger does not fire (to insert a table) in Report Builder (6i) but it fires when it's invoked from Apex.
It you run your report in Froms or Apex or...., try over there. -
Facing issue in after report trigger in XML publisher
HI All,
I have a XML template in that i am calling a after report trigger like below :
<dataTrigger name="afterReport" source="apps.testpkg.testupdate_fun(:HEADER_ID)"/>
I am passing the header_id from my header block to the function.
My Function looks like below:
FUNCTION testupdate_fun(P_HEADER_ID IN NUMBER ) RETURN BOOLEAN AS
BEGIN
UPDATE TEST_TABLE SET PROCESS_FLAG='P' WHERE HEADER_ID=P_HEADER_ID;
COMMIT;
return true;
EXCEPTION
WHEN OTHERS THEN
return false;
END;
The problem i am facing is it is updating only one record in the table.but in my header data block i am getting the details for more order numbers with header id like 1,2,3..., but it is updating only one header id in table, please help me out how to update record for all the header_id.
ThanksExamples of combining all IDs into comma-separate list can be found here: http://www.oracle-base.com/articles/misc/string-aggregation-techniques.php . That list you need to send as parameter to the trigger. In the trigger you may split it again and update the records one-by-one, or you can build an EXECUTE IMMEDIATE statement to update the table, and in that statement the list can be used as a whole, no need to split it. Please, advise on which steps of this process you need more detailed assistance.
-
After Update Trigger executes twice when single row is uptd thro proc
We have the below trigger in our db. When a single record is updated using a procedure the trigger is executed twice and it inserts two records in other table.
But when i issue an update statement using any sql client tool it is executing only once and inserts only one record in other table.
Can any one please help me to find the reason?
Trigger:*
create or replace TRIGGER CX_HEADER_ESCL_T1 AFTER UPDATE OF STATUS ON CX_HEADER
FOR EACH ROW
DECLARE
"b1-CTRIYJ" boolean := FALSE;
BEGIN
IF UPDATING('STATUS') AND(:NEW.status = 'SUCCESS') THEN
"b1-CTRIYJ" := TRUE;
END IF;
IF "b1-CTRIYJ" = TRUE THEN
INSERT
INTO siebel.s_escl_req(req_id, created, bt_row_id, rule_id, tbl_name, created_by, group_id)
VALUES('11111111', CURRENT_DATE, :NEW.row_id, '1-CTRIYJ', 'CX_HEADER', :NEW.last_upd_by, '1-2CU3');
"b1-CTRIYJ" := FALSE;
END IF;
END;
Procedure:
CREATE OR REPLACE
PROCEDURE CLOSE_BATCH
(ChildRecordCount IN NUMBER, HeaderId IN VARCHAR2, CompletionStatus OUT VARCHAR2) AS
CafeChildCount NUMBER;
BEGIN
select count(*) into CafeChildCount from SIEBEL.CX_CHILD where HEADER_ID=HeaderId;
IF ChildRecordCount = CafeChildCount THEN
update SIEBEL.CX_HEADER set STATUS ='SUCCESS', MODIFICATION_NUM = MODIFICATION_NUM+1 where HEADER_ID=HeaderId;
CompletionStatus := 'SUCCESS';
ELSE
update SIEBEL.CX_CHILD set STATUS='FAILED' where HEADER_ID=HeaderId;
update SIEBEL.CX_HEADER set STATUS='FAILED' where HEADER_ID=HeaderId;
CompletionStatus := 'FAILED';
END IF;
commit;
/*CompletionStatus := 'SUCCESS';*/
EXCEPTION
WHEN OTHERS THEN
CompletionStatus := SQLCODE;
rollback;
END;Your problem seems not be related to the trigger restart issue I have already mentioned because you are using a AFTER UPDATE trigger and not a BEFORE UPDATE trigger:
>
BEFORE Triggers Fired Multiple Times
If an UPDATE or DELETE statement detects a conflict with a concurrent UPDATE, then Oracle Database performs a transparent ROLLBACK to SAVEPOINT and restarts the update. This can occur many times before the statement completes successfully. Each time the statement is restarted, the BEFORE statement trigger is fired again. The rollback to savepoint does not undo changes to any package variables referenced in the trigger. Your package should include a counter variable to detect this situation.
>
If you are sure that you update a single row and that your trigger fires twice and if you can easiily reproduce the issue, I recommend that you contact Oracle Support and create a Service Request for your issue that could be an Oracle bug. -
Update statement in After report trigger
Hi
I've written an update statement on a standard table to update one of its attributes in after report trigger.
And then commit.
I tried running the report without moving to reports top. The table was not updated.
What could have gone wrong?
Thanks
Regards
BalaKrishnaCould you provide the UPDATE statements?
-
DELETE in After report trigger
Please help us resolve the following problem in a 6i report.
The report had an After report trigger to delete the records from the same table used in the driver query. The report is launched thru a url to create a pdf file. The PDF is generated correctly for some users but for many others the PDF is generated with no data. When the delete statement is commented out, everybody get the PDF with data. All users have the same Acrobat Reader and IE version.
Any idea why this is happening ?
Appreciate your help
ThanksNavneeth, Dmytro
Thanks for your replies
The report is for generating some sort of certificates ( in pdf format) from a staging table. If the certificate is issued, the record is to be deleted. So the report is different in each run.
The real issue is the report behavior is not consistent from one machine to another. For the same set of data in the staging table for PC1 the PDF is generated and processed records are deleted. But in PC2 records are processed, records are deleted but the PDF has no data.
We tried to use a global temp. table, didn't help either.
In the before report trigger
insert into gt_table select * from staging_table
commit
Report query modified to get data from gt_table
After report trigger deletes records from staging_table
The PDF data is seen in PC1 but not in PC2
When the after report trigger is commented out, PDF launched in both machines contain data.
There are many reports which generates PDF file without a delete trigger and they all work well.
Is this problem happening because the records are getting deleted before pdf is launched? Or any type of browser (IE) or Acrobat reader settings required ?
The deletes can be handled in the front end application after launching the report url but preferred to keep it in the reports to avoid deleting records in case there's a problem with report server and records are not processed.
Thanks you for your help -
Triggers Firing Sequence Of Forms 10g after commit_form trigger.
hi all,
please tell me Triggers Firing Sequence Of Forms 10g after commit_form trigger.
thanks,
Regards,
AmbarishHi,
I have a doubt regarding the sequence of events when COMMIT_FORM is fired.
Using the following to trigger the event.
DO_KEY('COMMIT'_FORM');
Added debug messages in my form triggers and found that after the ON-INSERT trigger is fired, the WHEN-VALIDATE-RECORD is fired and then the PRE-RECORD.
However this sequence is not specified in the lists of firing sequences mentioned here.
Is it possible to change the sequence programmatically.
In my ON-INSERT trigger, calling a DB procedure to insert row in the table.
Thanks
Asfa -
I have a text field that has an LOV associated with it. The LOV is set to display automatically whenever the user navigates into the text field. Unfortunately if the user selects the field uses the LOV to update the field and then commits the Form the LOV pops up again. It seems that Forms navigates to the text field after the save. I want the LOV to appear when the user navigates to the field but not if the user saves while in the field. Is there a way to make it work that way?
ThanksYou can try this in a Key-Commit trigger:
IF :System.Cursor_Block='your_block' THEN
Go_Item(... another item without LOV ...);
END IF;
commit_form; -
Closing DBA session in AFTER LOGON trigger
Hello *,
this is my first question here and my first piece of code in oracle so please don't laugh ;-)
I'm trying to create an AFTER LOGON trigger which disconnects a user if he/she tries to log in from an incorrect host.
What should happen?
User tries to connect.
If he/she is permitted, a record is added to a table.
If not, a record is added to another table and the user is disconnected using RAISE_APPLICATION_ERROR().
After a number of issues I've got it working, except ... I have the feeling that RAISE_APPLICATION_ERROR() doesn't effect users with DBA privileges.
Finally, I'm testing it with one ordinary user - DEF.
The main idea is to disallow connections from user ABC which has DBA privileges.
Tests using DEF are successful but when ABC tries to log in from an incorrect host, a record is added in pcbaudit_failed_logins but the user is not disconnected.
The database is 9.2.0.8.0 and I'm prepared to post RDA report if it is required.
Thank you for your help in advance - I hope I was kind enough :P
Here's the code for the trigger:
DROP TABLE pcbaudit_users;
CREATE TABLE pcbaudit_users (username VARCHAR2(32) NOT NULL, host VARCHAR2(64) NOT NULL);
CREATE INDEX idx_pcbaudit_users_username ON pcbaudit_users(username);
CREATE INDEX idx_pcbaudit_users_host ON pcbaudit_users(host);
DROP TABLE pcbaudit_logins;
CREATE TABLE pcbaudit_logins (username VARCHAR2(32), ip_address VARCHAR2(15), host VARCHAR2(64), ts DATE);
DROP TABLE pcbaudit_failed_logins;
CREATE TABLE pcbaudit_failed_logins (username VARCHAR2(32), ip_address VARCHAR2(15), host VARCHAR2(64), ts DATE);
CREATE OR REPLACE PUBLIC SYNONYM pcbaudit_users FOR sys.pcbaudit_users;
CREATE OR REPLACE PUBLIC SYNONYM pcbaudit_logins FOR sys.pcbaudit_logins;
CREATE OR REPLACE PUBLIC SYNONYM pcbaudit_failed_logins FOR sys.pcbaudit_failed_logins;
GRANT SELECT ON sys.pcbaudit_users TO public;
GRANT INSERT ON sys.pcbaudit_logins TO public;
GRANT INSERT ON sys.pcbaudit_failed_logins TO public;
INSERT INTO pcbaudit_users VALUES ('SYS', '%');
INSERT INTO pcbaudit_users VALUES ('SYSTEM', '%');
INSERT INTO pcbaudit_users VALUES ('ABC', '%');
INSERT INTO pcbaudit_users VALUES ('DEF', '%');
COMMIT;
CREATE OR REPLACE
TRIGGER logon_pcbaudit_trigger AFTER LOGON ON DATABASE
DECLARE
v_username VARCHAR2(32); /* variable that will hold current username */
v_host VARCHAR2(4000); /* variable that will hold current host */
v_allowed NUMBER(1) := 0;
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
SELECT UPPER(USER), /* current user */
UPPER(SYS_CONTEXT('USERENV', 'HOST')) /* current user host */
INTO v_username,
v_host
FROM dual;
/* debug */
-- DBMS_OUTPUT.PUT_LINE(v_username || '@' || v_host);
SELECT 1
INTO v_allowed
FROM pcbaudit_users
WHERE UPPER(username) = v_username
AND (
UPPER(REPLACE(v_host, CHR(0), '')) LIKE UPPER(host) ESCAPE '!' /* fuck that shit! Something appends CHR(0) to its host... */
OR
v_host IS NULL /* fuck that shit! Some hosts are NULLs! */
/* write log (user has logged in!) */
INSERT
INTO pcbaudit_logins
(username, ip_address, host, ts)
VALUES
(v_username, SYS_CONTEXT('USERENV', 'IP_ADDRESS'), v_host, SYSDATE);
COMMIT;
EXCEPTION
WHEN NO_DATA_FOUND THEN /* occurs when no matches were found; i.e. current username is not permitted to login from the current host */
/* log the failed attempt */
INSERT
INTO pcbaudit_failed_logins
(username, ip_address, host, ts)
VALUES
(v_username, SYS_CONTEXT('USERENV', 'IP_ADDRESS'), v_host, SYSDATE);
COMMIT;
/* disconnect user */
RAISE_APPLICATION_ERROR(-20001, v_username || '@' || v_host || ' is not allowed to connect.');
WHEN OTHERS THEN
NULL; /* in this case, NULL is better than an error - if an error occurs, user will not be able to login. */
END;Thank you for your reply!
The situation is quite complicated.
I am aware that a user with DBA privileges can drop the trigger, modify it, etc.
There's an application on top of it and (i don't know why) it requires dba privileges. The point is, there are developers with access to the production database and my task is to stop them from logging in with this username.
Since I'm creating a trigger, I've obviously have no other choice. I can't change the user's password because of number of reasons, I can't deny developers' IP addresses using sqlnet.ora because they need read-only access and so on.
I realize that this is not the way that things are being done (development cycle), but I have no other choice.
So, is there any other way? -
After insert trigger with :NEW.ROWID
Hi All,
I am using a After insert trigger to generate history record as following:
CREATE TABLE TB_TEST (classID number(3), classNm varchar2(12));
CREATE TABLE TB_HIST_TEST (hist_dttm timestamp(6), classID number(3), classNm varchar2(12));
CREATE or REPLACE TRIGGER air_test AFTER INSERT ON tb_test FOR EACH ROW
BEGIN PK_SRVC.CRT_NewRec('TB_TEST', 'TB_HIST_TEST', :new.ROWID); END:
In PK_SRVC package, I use the following statment to create new record in TB_HIST_TABLE:
Insert into tb_hist_test (hist_dttm, classID, classNm)
values (select systimestamp, classID, classNm from tb_test where rowid = ROWID )
The trigger DOES fire when a new row is inserted into TB_TEST. However there is no record inserted into TB_HIST_TEST. Any suggestion?
Thanks,The PK_SRVC.CRT_NewRec is a generic service package that can be shared by many tables. It uses dynamic SQL to get all the collumns for different tables based on USER_TAB_COLUMNS. The following is the code of this package:
PROCEDURE CRT_NewRec ( p_TableName IN VARCHAR2, p_AudTableName IN VARCHAR2, p_RowID)
IS
TYPE TabCol_RecTyp IS RECORD (COLUMN_NAME VARCHAR2(30), COLUMN_ID NUMBER);
TYPE TabCol_CurTyp IS REF CURSOR;
c_TabCol TabCol_CurTyp;
rc_TabCol TabCol_RecTyp;
v_Sql_TabCol VARCHAR2(1000);
v_ColNames VARCHAR2(1000);
v_Sql VARCHAR2(1000);
PRAGMA AUTONOMOUSE_TRANSCATION;
BEGIN
v_SQL_TabCol := ' SELECT column_name, column_id FROM USER_TAB_COLUMNS'
|| ' WHERE table_name = ' || CHR(39) || p_TableName || CHR(39)
|| ' ORDER BY column_id';
v_ColNames := NULL;
OPEN c_TabCol FOR v_Sql_TabCol;
Loop
FETCH c_TabCol INTO rc_TabCol; Exit WHEN c_TabCol%NOTFOUND:
v_ColNames := v_ColNames || ',' || rc_TabCol.COLUMN_NAME;
End Loop;
CLOSE c_TabCol;
v_Sql := 'INSERT INTO ' || p_AudTableName || '(HIST_DTTM, ' || v_ColNames || ' )'
|| ' SELECT systimestamp, ' || v_ColNames || ' FROM ' || p_TableName
|| ' WHEN ROWID = chartorowid(' || CHR(39) || p_RowId || CHR(39) || ')';
EXECUTE IMMEDIATE v_Sql;
COMMIT;
END;
(charmingholidays-yyz)
Maybe you are looking for
-
I have AOL as my mail-server and any photo that I am trying to attach will not open.The photos are in iPhoto and the message say that the format is not being recognized.AOL delivers the photos but they cant be open.
-
Splitting of Local Purchase Orders
Hey Experts, I need to split/group shopping carts into local POs' based on various parameters (additional parameters apart from the standard ones'). I guess badi BBP_GROUP_LOC_PO will help me acheive this. Has anyone worked on this BADI?? Can
-
I need help on these issue (watermarking and steganography)
Hi guys, my lecturer did assign me a an assignment. She asked to insert the information about the production's company,expired date, and the approval message into a logo (to avoid fraud lisence). She's giving me option whether to use steganography or
-
Receiving Video RTP Stream (JMF) in JME ( MMAPI ) - URGENT !!!
Hi Folks... I�m trying to develop an application that sends the images from a web cam connected to the computer, to the PDA that the images can be viewed by the user... My code for the JMF RTP Video Stream is as follows. Processor proc = null;
-
Missing header after IR search
Hello, I have a IR with some columns using JS to get the values of some items (as column header) below the IR region. <script> document.write($v("P12_TAM_1")); </script> When the page loads all of the headers show up, but if I make one research or fi