title: Can a trigger be locked; how would one determine that it is?
body: <p>In answering <a href="https://stackoverflow.com/q/18454052/458741">Will I miss any changes if I replace an oracle trigger while my application is running?</a>, I went looking to see if the trigger was locked by an INSERT statement. It wasn't and I can't find anything on the internet to suggest that a trigger can be locked.</p>
  
  <p>If I run the following in one session:</p>
  
  <pre><code>create table test_trigger (id number);
  create table test_trigger_h (id number);
  
  create or replace trigger test_trigger_t 
   after insert on test_trigger for each row
  begin
    insert into test_trigger_h (id) values (:new.id);
  end;    
  /
  
  insert into test_trigger
   select level
     from dual
  connect by level &lt;= 1000000;
  </code></pre>
  
  <p>and then in a second session try to find out what locks are occurring I get the following:</p>
  
  <pre><code>select object_name, object_type
       , case l.block
              when 0 then 'Not Blocking'
              when 1 then 'Blocking'
              when 2 then 'Global'
         end as status
       , case v.locked_mode
              when 0 then 'None'
              when 1 then 'Null'
              when 2 then 'Row-S (SS)'
              when 3 then 'Row-X (SX)'
              when 4 then 'Share'
              when 5 then 'S/Row-X (SSX)'
              when 6 then 'Exclusive'
              else to_char(lmode)
         end as mode_held
    from v$locked_object v
    join dba_objects d
      on v.object_id = d.object_id
    join v$lock l
      on v.object_id = l.id1
    join v$session s
      on v.session_id = s.sid
         ;
  
  OBJECT_NAME          OBJECT_TYPE          STATUS          MODE_HELD
  -------------------- -------------------- --------------- ---------------
  TEST_TRIGGER         TABLE                Not Blocking    Row-X (SX)
  TEST_TRIGGER_H       TABLE                Not Blocking    Row-X (SX)
  </code></pre>
  
  <p>According to Oracle, the trigger is <em>not</em> being locked.</p>
  
  <p>However, if I try to replace the trigger whilst the INSERT statement is running it will not be replaced until after the statement has completed (not including a commit), which implies that the trigger <em>is</em> locked.</p>
  
  <p>In this situation, is the trigger locked and if so how would one determine that it is?</p>