DB2- Drop a DB2 Schema

Overview: 

To drop a schema in DB2, you need to ensure that the schema is empty (i.e., all objects within the schema, such as tables, views, and other database objects, are removed). DB2 does not allow dropping a schema that contains objects. Here's a step-by-step guide: 

Steps to Drop a DB2 Schema

Connect to the Database: Connect to the DB2 database where the schema resides.

db2 connect to <DATABASE_NAME> user <USER_NAME> using <PASSWORD>

List Objects in the Schema (Optional): To view the objects in the schema before dropping it, use:
1 Drop CONSTRAINT

2 DROP SEQUENCE

3 DROP ALIAS

4 DROP TABLE

5 DROP PROCEDURE

6 DROP TRIGGER 


SELECT * FROM SYSCAT.TABLES WHERE TABSCHEMA = '<SCHEMA_NAME>';

SELECT * FROM SYSCAT.VIEWS WHERE VIEWSCHEMA = '<SCHEMA_NAME>';

SELECT * FROM SYSCAT.INDEXES WHERE INDSCHEMA = '<SCHEMA_NAME>';

select substr(TABSCHEMA ,1,10) SCHEMANAME , Substr(TABNAME,1,80) TABLENAME, count(*) columnscount 

from syscat.columns where TABSCHEMA not like '%SYS%'

group by TABSCHEMA , TABNAME having TABSCHEMA='test' with UR

Table name with details


SELECT TAB.TABSCHEMA AS SCHEMA_NAME ,TAB.TABNAME AS TABLE_NAME

FROM SYSCAT.TABLES TAB  WHERE TAB.TYPE = 'T'

AND TAB.TABSCHEMA = 'TEST'

ORDER BY TAB.TABSCHEMA, TAB.TABNAME;

Sequence name with details


SELECT SEQSCHEMA AS SCHEMA_NAME ,SEQNAME AS SEQ_NAME ,

CYCLE ,ORDER ,CACHE

FROM SYSCAT.SEQUENCES

WHERE SEQSCHEMA = 'TEST'

AND SEQTYPE = 'S'

ORDER BY SEQSCHEMA , SEQNAME;


Aliases name with details


SELECT TABSCHEMA,TABNAME,BASE_TABNAME

FROM SYSCAT.TABLES

WHERE TYPE = 'A'

AND TABSCHEMA = 'TEST'


Store procedure name with details


SELECT ROUTINESCHEMA AS SCHEMA_NAME ,

ROUTINENAME AS PROCEDURE_NAME

FROM SYSCAT.ROUTINES

WHERE ROUTINETYPE = 'P'

AND ROUTINESCHEMA NOT LIKE 'SYS%'

AND ROUTINESCHEMA NOT LIKE 'SQLJ%'

AND ROUTINESCHEMA = 'TEST'

ORDER BY SCHEMA_NAME , PROCEDURE_NAME;


Trigger name with details


SELECT TABSCHEMA AS TABLE_SCHEMA ,

TRIGNAME AS TRIGGER_NAME ,

TABNAME AS TABLE_NAME ,

CASE TRIGTIME

WHEN 'B' THEN 'BEFORE'

WHEN 'A' THEN 'AFTER'

WHEN 'I' THEN 'INSTEAD OF'

END AS ACTIVATION

,RTRIM(

CASE WHEN EVENTUPDATE ='Y' THEN 'UPDATE ' ELSE ''

END

||

CASE WHEN EVENTDELETE ='Y' THEN 'DELETE ' ELSE ''

END

||

CASE WHEN EVENTINSERT ='Y' THEN 'INSERT ' ELSE ''

END

) AS EVENT

FROM     SYSCAT.TRIGGERS T

WHERE    TABSCHEMA NOT LIKE 'SYS%'

ORDER BY TABLE_SCHEMA , TABLE_NAME ,

TRIGGER_NAME ;


Drop Objects in the Schema


Drop Objects in the Schema: Remove all objects (tables, views, indexes, etc.) in the schema. For example:


DROP CONSTRAINT <SCHEMA_NAME>.<TABLE_NAME>;

DROP SEQUENCE <SCHEMA_NAME>.<TABLE_NAME>;

DROP ALIAS  <SCHEMA_NAME>.<TABLE_NAME>;
DROP TABLE <SCHEMA_NAME>.<TABLE_NAME>;

DROP VIEW <SCHEMA_NAME>.<VIEW_NAME>;

DROP INDEX <SCHEMA_NAME>.<INDEX_NAME>;

DROP PROCEDURE <SCHEMA_NAME>.<VIEW_NAME>;

DROP TRIGGER <SCHEMA_NAME>.<VIEW_NAME>;

STEP 1 : DROP CONSTRAINT

db2 -x "

SELECT substr(R.reftabschema,1,20) AS P_Schema,

      substr(R.reftabname,1,40) AS PARENT,

      substr(R.tabschema,1,20) AS C_Schema,

      substr (R.tabname,1,40) AS CHILD,

      substr(R.constname,1,80) AS CONSTNAME,

      substr(LISTAGG(C.colname,', ') WITHIN

             GROUP (

                    ORDER BY C.colname),1,40) AS FKCOLS

FROM syscat.references R,

    syscat.keycoluse C

WHERE R.constname = C.constname

 AND R.tabschema = C.tabschema

 --AND R.tabname = C.tabname

  AND R.tabschema in ('TEST')

GROUP BY R.reftabschema,

        R.reftabname,

        R.tabschema,

        R.tabname,

        R.constname" > TEST-RI.txt


STEP 2 :

cat TEST-RI.txt | while read P_SCHEMA PARENT C_SCHEMA CHILD CONSTNAME FKCOLS

do

echo "ALTER TABLE $C_SCHEMA.$CHILD DROP CONSTRAINT $CONSTNAME ;" >> TEST_RI_DROP.sql

done

 If you want to automate this, you can generate DROP statements dynamically by querying the SYSCAT tables.


Drop Schema Command


DROP SCHEMA TEST RESTRICT

Drop the Schema: Once the schema is empty, you can drop it.

DROP SCHEMA <SCHEMA_NAME> RESTRICT;

Verify the Schema Is Dropped: Check if the schema still exists:

SELECT SCHEMANAME FROM SYSCAT.SCHEMATA WHERE SCHEMANAME = '<SCHEMA_NAME>';

Important Notes

Would you like help with generating automated scripts to drop all objects in a schema?