<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Re: Database triggers on versioned feature classes in Data Management Questions</title>
    <link>https://community.esri.com/t5/data-management-questions/database-triggers-on-versioned-feature-classes/m-p/613475#M34601</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;After working with someone more experienced with PL-SQL, we found the "mutating" issue was with&amp;nbsp;querying the A table that the trigger was supposed to be modifying. Our solution was to create a separate function to query the A table for the max ObjectID so the trigger didn't have to do it directly.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;PRE class="lia-code-sample line-numbers language-none"&gt;&lt;CODE&gt;&lt;SPAN class="keyword token"&gt;CREATE&lt;/SPAN&gt; &lt;SPAN class="operator token"&gt;OR&lt;/SPAN&gt; REPLACE &lt;SPAN class="keyword token"&gt;FUNCTION&lt;/SPAN&gt; GIS&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;MaxObjectID&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;p_owner VARCHAR2&lt;SPAN class="punctuation token"&gt;,&lt;/SPAN&gt; p_tablename VARCHAR2&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt; &lt;SPAN class="keyword token"&gt;RETURN&lt;/SPAN&gt; NUMBER &lt;SPAN class="operator token"&gt;IS&lt;/SPAN&gt;
max_objectid NUMBER&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;
regid NUMBER&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;
vc2SqlStr VARCHAR2&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;&lt;SPAN class="number token"&gt;1000&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;
&lt;SPAN class="comment token"&gt;/******************************************************************************
PURPOSE: Allow EID triggers to find the max ObjectID in the base table
and the add table when determining if the EID value should be
updated. Without this check, modifying new features that have
not been compressed to the base table will get a new EID each
time an edit is saved (when a record is inserted into the add
table).
In the case of a brand new feature class without rows, the
NVL statement is needed to return 0 instead of -1 for the very
first record.
This function is meant to be used by EID triggers
across all schemas.

Takes input of schema owner and table name as separate
parameters. Has look-up in table registry for add table.

Returns the maximum ObjectID as a number or -1 if error.
******************************************************************************/&lt;/SPAN&gt;
&lt;SPAN class="keyword token"&gt;BEGIN&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class="keyword token"&gt;BEGIN&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class="keyword token"&gt;select&lt;/SPAN&gt; tr&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;REGISTRATION_ID 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class="keyword token"&gt;into&lt;/SPAN&gt; regid
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class="keyword token"&gt;from&lt;/SPAN&gt; SDE&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;TABLE_REGISTRY tr
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class="keyword token"&gt;where&lt;/SPAN&gt; tr&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;OWNER &lt;SPAN class="operator token"&gt;=&lt;/SPAN&gt; p_owner &lt;SPAN class="operator token"&gt;and&lt;/SPAN&gt; tr&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;TABLE_NAME &lt;SPAN class="operator token"&gt;=&lt;/SPAN&gt; p_tablename&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EXCEPTION &lt;SPAN class="keyword token"&gt;WHEN&lt;/SPAN&gt; OTHERS &lt;SPAN class="keyword token"&gt;THEN&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; regid :&lt;SPAN class="operator token"&gt;=&lt;/SPAN&gt; &lt;SPAN class="number token"&gt;0&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class="keyword token"&gt;END&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; vc2SqlStr :&lt;SPAN class="operator token"&gt;=&lt;/SPAN&gt; &lt;SPAN class="string token"&gt;'select NVL(max(objectid), 0) from (
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; select max(OBJECTID) as objectid from '&lt;/SPAN&gt;&lt;SPAN class="operator token"&gt;||&lt;/SPAN&gt;p_owner&lt;SPAN class="operator token"&gt;||&lt;/SPAN&gt;&lt;SPAN class="string token"&gt;'.'&lt;/SPAN&gt;&lt;SPAN class="operator token"&gt;||&lt;/SPAN&gt;p_tablename&lt;SPAN class="operator token"&gt;||&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class="string token"&gt;' union all 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; select max(OBJECTID) as objectid from '&lt;/SPAN&gt;&lt;SPAN class="operator token"&gt;||&lt;/SPAN&gt;p_owner&lt;SPAN class="operator token"&gt;||&lt;/SPAN&gt;&lt;SPAN class="string token"&gt;'.A'&lt;/SPAN&gt;&lt;SPAN class="operator token"&gt;||&lt;/SPAN&gt;regid&lt;SPAN class="operator token"&gt;||&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class="string token"&gt;')'&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class="keyword token"&gt;BEGIN&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class="keyword token"&gt;EXECUTE&lt;/SPAN&gt; IMMEDIATE vc2SqlStr &lt;SPAN class="keyword token"&gt;INTO&lt;/SPAN&gt; max_objectid&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EXCEPTION &lt;SPAN class="keyword token"&gt;WHEN&lt;/SPAN&gt; OTHERS &lt;SPAN class="keyword token"&gt;THEN&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; max_objectid :&lt;SPAN class="operator token"&gt;=&lt;/SPAN&gt; &lt;SPAN class="operator token"&gt;-&lt;/SPAN&gt;&lt;SPAN class="number token"&gt;1&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class="keyword token"&gt;END&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class="keyword token"&gt;RETURN&lt;/SPAN&gt; max_objectid&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;
&lt;SPAN class="keyword token"&gt;END&lt;/SPAN&gt; MaxObjectID&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;
&lt;SPAN class="operator token"&gt;/&lt;/SPAN&gt;‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍&lt;SPAN class="line-numbers-rows"&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;P&gt;It returns the max ObjectID of whatever table you want or &lt;SPAN style="font-family: 'courier new', courier, monospace;"&gt;-1&lt;/SPAN&gt; if there was an error. Every trigger calls this function so we made it in a generic "GIS" schema. Here's an example of a&amp;nbsp;trigger:&lt;/P&gt;&lt;PRE class="lia-code-sample line-numbers language-none"&gt;&lt;CODE&gt;&lt;SPAN class="keyword token"&gt;CREATE&lt;/SPAN&gt; &lt;SPAN class="operator token"&gt;OR&lt;/SPAN&gt; REPLACE &lt;SPAN class="keyword token"&gt;TRIGGER&lt;/SPAN&gt; WS&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;HYDRANT_EID_TRG
BEFORE &lt;SPAN class="keyword token"&gt;INSERT&lt;/SPAN&gt; &lt;SPAN class="keyword token"&gt;ON&lt;/SPAN&gt; WS&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;A658&amp;nbsp; &lt;SPAN class="comment token"&gt;-- Add Table Name&lt;/SPAN&gt;
&lt;SPAN class="keyword token"&gt;for each row&lt;/SPAN&gt;
&lt;SPAN class="keyword token"&gt;declare&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; max_objectid WS&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;A658&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;objectid&lt;SPAN class="operator token"&gt;%&lt;/SPAN&gt;&lt;SPAN class="keyword token"&gt;type&lt;/SPAN&gt;:&lt;SPAN class="operator token"&gt;=&lt;/SPAN&gt;&lt;SPAN class="number token"&gt;0&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;
&lt;SPAN class="keyword token"&gt;begin&lt;/SPAN&gt;
max_objectid :&lt;SPAN class="operator token"&gt;=&lt;/SPAN&gt; GIS&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;MaxObjectID&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;&lt;SPAN class="string token"&gt;'WS'&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;,&lt;/SPAN&gt; &lt;SPAN class="string token"&gt;'HYDRANT_PNT'&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;&amp;nbsp; &lt;SPAN class="comment token"&gt;-- Base Table Owner, Name&lt;/SPAN&gt;
&lt;SPAN class="keyword token"&gt;if&lt;/SPAN&gt; max_objectid &lt;SPAN class="operator token"&gt;&amp;lt;&amp;gt;&lt;/SPAN&gt; &lt;SPAN class="operator token"&gt;-&lt;/SPAN&gt;&lt;SPAN class="number token"&gt;1&lt;/SPAN&gt; &lt;SPAN class="operator token"&gt;and&lt;/SPAN&gt; &lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;:new&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;eid &lt;SPAN class="operator token"&gt;is&lt;/SPAN&gt; &lt;SPAN class="token boolean"&gt;NULL&lt;/SPAN&gt; &lt;SPAN class="operator token"&gt;or&lt;/SPAN&gt; :new&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;objectid &lt;SPAN class="operator token"&gt;&amp;gt;&lt;/SPAN&gt; max_objectid&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt; &lt;SPAN class="keyword token"&gt;then&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class="keyword token"&gt;SELECT&lt;/SPAN&gt; HYDRANT_EID_SEQ&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;NEXTVAL &lt;SPAN class="keyword token"&gt;INTO&lt;/SPAN&gt; :NEW&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;EID &lt;SPAN class="keyword token"&gt;FROM&lt;/SPAN&gt; DUAL&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;
&lt;SPAN class="keyword token"&gt;end&lt;/SPAN&gt; &lt;SPAN class="keyword token"&gt;if&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;
&lt;SPAN class="keyword token"&gt;end&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;
&lt;SPAN class="operator token"&gt;/&lt;/SPAN&gt;&lt;SPAN class="line-numbers-rows"&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Sun, 12 Dec 2021 02:14:11 GMT</pubDate>
    <dc:creator>BlakeTerhune</dc:creator>
    <dc:date>2021-12-12T02:14:11Z</dc:date>
    <item>
      <title>Database triggers on versioned feature classes</title>
      <link>https://community.esri.com/t5/data-management-questions/database-triggers-on-versioned-feature-classes/m-p/613474#M34600</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Our organization has a need to create database triggers (in Oracle 11g) that generate a unique number from a sequence. Currently, the triggers look something like this (EID is the unique number we're generating from a sequence).&lt;/P&gt;&lt;PRE class="lia-code-sample line-numbers language-none"&gt;CREATE OR REPLACE TRIGGER WS.SYSTEM_VALVE_EID_TRG&amp;nbsp; -- TRIGGER NAME&amp;nbsp; 
BEFORE INSERT ON WS.A13246&amp;nbsp; -- ADDs TABLE 
for each row
declare
max_objectid A13246.objectid%type:=0;
begin
select max(objectid) into max_objectid from SYSTEM_VALVE_PNT;
--determine if the new objectid is greater then the max from base table
if (max_objectid &amp;lt;:new.objectid) then
SELECT SYSVALVE_EID_SEQ.NEXTVAL INTO :NEW.EID FROM DUAL;&amp;nbsp; 
end if;
--if new eid is null, new asset
if (:new.eid is null) then 
SELECT SYSVALVE_EID_SEQ.NEXTVAL INTO :NEW.EID FROM DUAL;&amp;nbsp; 
end if;
end;
/&lt;/PRE&gt;&lt;P&gt;I tried to alter the SQL to query max objectid from the base table and the A table but I started getting&lt;/P&gt;&lt;BLOCKQUOTE&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;&lt;P&gt;&lt;SPAN style="font-family: 'courier new', courier;"&gt;Underlying DBMS error [ORA-040941: table WS.A13246 is mutating, trigger/function may not see it&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/BLOCKQUOTE&gt;&lt;P&gt;Has anyone done stuff like this? Any advice on how to successfully make triggers on versioned feature classes (besides "don't use triggers")?&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Sun, 12 Dec 2021 02:14:08 GMT</pubDate>
      <guid>https://community.esri.com/t5/data-management-questions/database-triggers-on-versioned-feature-classes/m-p/613474#M34600</guid>
      <dc:creator>BlakeTerhune</dc:creator>
      <dc:date>2021-12-12T02:14:08Z</dc:date>
    </item>
    <item>
      <title>Re: Database triggers on versioned feature classes</title>
      <link>https://community.esri.com/t5/data-management-questions/database-triggers-on-versioned-feature-classes/m-p/613475#M34601</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;After working with someone more experienced with PL-SQL, we found the "mutating" issue was with&amp;nbsp;querying the A table that the trigger was supposed to be modifying. Our solution was to create a separate function to query the A table for the max ObjectID so the trigger didn't have to do it directly.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;PRE class="lia-code-sample line-numbers language-none"&gt;&lt;CODE&gt;&lt;SPAN class="keyword token"&gt;CREATE&lt;/SPAN&gt; &lt;SPAN class="operator token"&gt;OR&lt;/SPAN&gt; REPLACE &lt;SPAN class="keyword token"&gt;FUNCTION&lt;/SPAN&gt; GIS&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;MaxObjectID&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;p_owner VARCHAR2&lt;SPAN class="punctuation token"&gt;,&lt;/SPAN&gt; p_tablename VARCHAR2&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt; &lt;SPAN class="keyword token"&gt;RETURN&lt;/SPAN&gt; NUMBER &lt;SPAN class="operator token"&gt;IS&lt;/SPAN&gt;
max_objectid NUMBER&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;
regid NUMBER&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;
vc2SqlStr VARCHAR2&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;&lt;SPAN class="number token"&gt;1000&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;
&lt;SPAN class="comment token"&gt;/******************************************************************************
PURPOSE: Allow EID triggers to find the max ObjectID in the base table
and the add table when determining if the EID value should be
updated. Without this check, modifying new features that have
not been compressed to the base table will get a new EID each
time an edit is saved (when a record is inserted into the add
table).
In the case of a brand new feature class without rows, the
NVL statement is needed to return 0 instead of -1 for the very
first record.
This function is meant to be used by EID triggers
across all schemas.

Takes input of schema owner and table name as separate
parameters. Has look-up in table registry for add table.

Returns the maximum ObjectID as a number or -1 if error.
******************************************************************************/&lt;/SPAN&gt;
&lt;SPAN class="keyword token"&gt;BEGIN&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class="keyword token"&gt;BEGIN&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class="keyword token"&gt;select&lt;/SPAN&gt; tr&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;REGISTRATION_ID 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class="keyword token"&gt;into&lt;/SPAN&gt; regid
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class="keyword token"&gt;from&lt;/SPAN&gt; SDE&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;TABLE_REGISTRY tr
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class="keyword token"&gt;where&lt;/SPAN&gt; tr&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;OWNER &lt;SPAN class="operator token"&gt;=&lt;/SPAN&gt; p_owner &lt;SPAN class="operator token"&gt;and&lt;/SPAN&gt; tr&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;TABLE_NAME &lt;SPAN class="operator token"&gt;=&lt;/SPAN&gt; p_tablename&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EXCEPTION &lt;SPAN class="keyword token"&gt;WHEN&lt;/SPAN&gt; OTHERS &lt;SPAN class="keyword token"&gt;THEN&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; regid :&lt;SPAN class="operator token"&gt;=&lt;/SPAN&gt; &lt;SPAN class="number token"&gt;0&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class="keyword token"&gt;END&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; vc2SqlStr :&lt;SPAN class="operator token"&gt;=&lt;/SPAN&gt; &lt;SPAN class="string token"&gt;'select NVL(max(objectid), 0) from (
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; select max(OBJECTID) as objectid from '&lt;/SPAN&gt;&lt;SPAN class="operator token"&gt;||&lt;/SPAN&gt;p_owner&lt;SPAN class="operator token"&gt;||&lt;/SPAN&gt;&lt;SPAN class="string token"&gt;'.'&lt;/SPAN&gt;&lt;SPAN class="operator token"&gt;||&lt;/SPAN&gt;p_tablename&lt;SPAN class="operator token"&gt;||&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class="string token"&gt;' union all 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; select max(OBJECTID) as objectid from '&lt;/SPAN&gt;&lt;SPAN class="operator token"&gt;||&lt;/SPAN&gt;p_owner&lt;SPAN class="operator token"&gt;||&lt;/SPAN&gt;&lt;SPAN class="string token"&gt;'.A'&lt;/SPAN&gt;&lt;SPAN class="operator token"&gt;||&lt;/SPAN&gt;regid&lt;SPAN class="operator token"&gt;||&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class="string token"&gt;')'&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class="keyword token"&gt;BEGIN&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class="keyword token"&gt;EXECUTE&lt;/SPAN&gt; IMMEDIATE vc2SqlStr &lt;SPAN class="keyword token"&gt;INTO&lt;/SPAN&gt; max_objectid&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EXCEPTION &lt;SPAN class="keyword token"&gt;WHEN&lt;/SPAN&gt; OTHERS &lt;SPAN class="keyword token"&gt;THEN&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; max_objectid :&lt;SPAN class="operator token"&gt;=&lt;/SPAN&gt; &lt;SPAN class="operator token"&gt;-&lt;/SPAN&gt;&lt;SPAN class="number token"&gt;1&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class="keyword token"&gt;END&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class="keyword token"&gt;RETURN&lt;/SPAN&gt; max_objectid&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;
&lt;SPAN class="keyword token"&gt;END&lt;/SPAN&gt; MaxObjectID&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;
&lt;SPAN class="operator token"&gt;/&lt;/SPAN&gt;‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍&lt;SPAN class="line-numbers-rows"&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;P&gt;It returns the max ObjectID of whatever table you want or &lt;SPAN style="font-family: 'courier new', courier, monospace;"&gt;-1&lt;/SPAN&gt; if there was an error. Every trigger calls this function so we made it in a generic "GIS" schema. Here's an example of a&amp;nbsp;trigger:&lt;/P&gt;&lt;PRE class="lia-code-sample line-numbers language-none"&gt;&lt;CODE&gt;&lt;SPAN class="keyword token"&gt;CREATE&lt;/SPAN&gt; &lt;SPAN class="operator token"&gt;OR&lt;/SPAN&gt; REPLACE &lt;SPAN class="keyword token"&gt;TRIGGER&lt;/SPAN&gt; WS&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;HYDRANT_EID_TRG
BEFORE &lt;SPAN class="keyword token"&gt;INSERT&lt;/SPAN&gt; &lt;SPAN class="keyword token"&gt;ON&lt;/SPAN&gt; WS&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;A658&amp;nbsp; &lt;SPAN class="comment token"&gt;-- Add Table Name&lt;/SPAN&gt;
&lt;SPAN class="keyword token"&gt;for each row&lt;/SPAN&gt;
&lt;SPAN class="keyword token"&gt;declare&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; max_objectid WS&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;A658&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;objectid&lt;SPAN class="operator token"&gt;%&lt;/SPAN&gt;&lt;SPAN class="keyword token"&gt;type&lt;/SPAN&gt;:&lt;SPAN class="operator token"&gt;=&lt;/SPAN&gt;&lt;SPAN class="number token"&gt;0&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;
&lt;SPAN class="keyword token"&gt;begin&lt;/SPAN&gt;
max_objectid :&lt;SPAN class="operator token"&gt;=&lt;/SPAN&gt; GIS&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;MaxObjectID&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;&lt;SPAN class="string token"&gt;'WS'&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;,&lt;/SPAN&gt; &lt;SPAN class="string token"&gt;'HYDRANT_PNT'&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;&amp;nbsp; &lt;SPAN class="comment token"&gt;-- Base Table Owner, Name&lt;/SPAN&gt;
&lt;SPAN class="keyword token"&gt;if&lt;/SPAN&gt; max_objectid &lt;SPAN class="operator token"&gt;&amp;lt;&amp;gt;&lt;/SPAN&gt; &lt;SPAN class="operator token"&gt;-&lt;/SPAN&gt;&lt;SPAN class="number token"&gt;1&lt;/SPAN&gt; &lt;SPAN class="operator token"&gt;and&lt;/SPAN&gt; &lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;:new&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;eid &lt;SPAN class="operator token"&gt;is&lt;/SPAN&gt; &lt;SPAN class="token boolean"&gt;NULL&lt;/SPAN&gt; &lt;SPAN class="operator token"&gt;or&lt;/SPAN&gt; :new&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;objectid &lt;SPAN class="operator token"&gt;&amp;gt;&lt;/SPAN&gt; max_objectid&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt; &lt;SPAN class="keyword token"&gt;then&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class="keyword token"&gt;SELECT&lt;/SPAN&gt; HYDRANT_EID_SEQ&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;NEXTVAL &lt;SPAN class="keyword token"&gt;INTO&lt;/SPAN&gt; :NEW&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;EID &lt;SPAN class="keyword token"&gt;FROM&lt;/SPAN&gt; DUAL&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;
&lt;SPAN class="keyword token"&gt;end&lt;/SPAN&gt; &lt;SPAN class="keyword token"&gt;if&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;
&lt;SPAN class="keyword token"&gt;end&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;
&lt;SPAN class="operator token"&gt;/&lt;/SPAN&gt;&lt;SPAN class="line-numbers-rows"&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Sun, 12 Dec 2021 02:14:11 GMT</pubDate>
      <guid>https://community.esri.com/t5/data-management-questions/database-triggers-on-versioned-feature-classes/m-p/613475#M34601</guid>
      <dc:creator>BlakeTerhune</dc:creator>
      <dc:date>2021-12-12T02:14:11Z</dc:date>
    </item>
  </channel>
</rss>

