*************************************************************************************
* Description: Creating trigger and sequence to add primary key on an existing table
* Date: 05:13 PM EST, 08/01/2017
*************************************************************************************


<1> Synmton:
     |
     |__ o. In Oracle database, if a tables got created without primary key, the application may throw out below Error 6013:
            
                 The table/view 'EMERALIT_DEV.RENEWAL_INDUSTRY_CATEGORY' does not have a primary key defined and no valid primary key could be inferred. 
                 The table/view has been excluded. To use the entity, you will need to review your schema, add the correct keys, and uncomment it.
             		 
							 
		
<2> Creating a preseudo primary key column on an exsiting table:		
     |
     |
     |__ o. Table DDL before applying the changes:
     |
     |           SQL> CREATE TABLE "EMERALIT"."RENEWAL_COEFFICIENTS"
     |                 (    "VAR_DESCRIPTION" VARCHAR2(50),
     |                      "VAR_COEFFICIENT" NUMBER,
     |                      "MODEL_NO" NUMBER,
     |                      "VAR_CODE" VARCHAR2(2)
     |                 ) SEGMENT CREATION IMMEDIATE
     |                PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
     |               NOCOMPRESS LOGGING
     |                STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
     |                PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
     |                BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
     |                TABLESPACE "LAPPS_DATA";	 
     |		   
     |
     |__ o. Adding a new column as primary key:		   
     |       
     |           SQL> ALTER TABLE EMERALIT.RENEWAL_COEFFICIENTS ADD( RENEWAL_ID number ); 	 
     |
     |
     |__ o. Creating a sequence for the primary key value:
     |    
     |           SQL> CREATE SEQUENCE EMERALIT.RENEWAL_ID_SEQ START WITH 1 INCREMENT BY 1;		  
     |
     |	 
     |__ o. Update table with assigning sequence number as primary key value:	 
     |
     |           SQL> UPDATE EMERALIT.RENEWAL_COEFFICIENTS SET RENEWAL_ID = EMERALIT.RENEWAL_ID_SEQ.nextval; 
     |
     |
     |__ o. Creating constraint on primary key column:
     |
     |           SQL> ALTER TABLE EMERALIT.RENEWAL_COEFFICIENTS ADD CONSTRAINT PK_RENEWAL_ID PRIMARY KEY( RENEWAL_ID );
     |
     |
     |__ o. Create insert trigger to ensure primary key value got updated automatically:
	 
                 SQL> CREATE OR REPLACE TRIGGER EMERALIT.RENEWAL_ID_TRGG
                        BEFORE INSERT ON EMERALIT.RENEWAL_COEFFICIENTS
                        FOR EACH ROW
                      BEGIN
                        :new.RENEWAL_ID := EMERALIT.RENEWAL_ID_SEQ.nextval;
                      END;
                      /
		 
	
	

Your Comments