Zurück

Vorgehen um ein Feld aus einer Oracle Tabelle zu entfernen

-------------------------------------------------------
    SQL-script to DROP field from an ORACLE table
-------------------------------------------------------
Tablename: DEPT
Colunname: DNAME (must be removed from table)
1). Copy table DEPT to DEPT_TMP without field DNAME
----------------------------------------------------
CREATE TABLE dept_tmp
PCTFREE 10
PCTUSED 40
INITRANS 1
MAXTRANS 255
STORAGE(INITIAL         10000
        NEXT            10000
        MINEXTENTS      1
        MAXEXTENTS      UNLIMITED
        PCTINCREASE     0
        FREELISTS       1)
TABLESPACE tab
AS SELECT deptno,          
          loc          
FROM dept;
2). Drop all constraints referencing orign table DEPT
-----------------------------------------------------
ALTER TABLE emp DROP CONSTRAINT emp_foreign_key;
ALTER TABLE dept DROP CONSTRAINT dept_primary_key;
3). Drop origin table DEPT
--------------------------
DROP TABLE dept;
4). Rename table DEPT_TMP to new table DEPT
-------------------------------------------
RENAME dept_tmp to dept;
5). Drop all all auomatically renamed constraints in new table DEPT
-------------------------------------------------------------------
SPOOL drop_constraints.sql
SELECT 'ALTER TABLE dept DROP CONSTRAINT '||constraint_name||';'
  FROM user_constraints
 WHERE UPPER(table_name) = 'DEPT';
SPOOL OFF;
start drop_constraints.sql
6). Rebuild constraints on new table DEPT
-----------------------------------------
ALTER TABLE dept MODIFY (deptno CONSTRAINT nn_dept_deptno NOT NULL);
ALTER TABLE dept ADD
  CONSTRAINT dept_primary_key PRIMARY KEY (deptno)
  USING INDEX
  TABLESPACE idx
  STORAGE
 (INITIAL       500K
  NEXT          500K
  MINEXTENTS    1
  MAXEXTENTS    UNLIMITED
  PCTINCREASE   0
  FREELISTS     2);
7). Rebuild Foreign Keys in all tables referencing table DEPT
---------------------------------------------------------------
ALTER TABLE emp
  ADD (CONSTRAINT emp_foreign_key FOREIGN KEY (deptno)
  REFERENCES dept (deptno));
8). Rebuild Indexes in all tables referencing table DEPT
--------------------------------------------------------
CREATE INDEX emp_deptno_idx ON emp (deptno)
  TABLESPACE idx
  STORAGE (INITIAL 500K NEXT 500K MINEXTENTS 1 MAXEXTENTS UNLIMITED PCTINCREASE 0)
  PCTFREE 10;
9). Grant all privileges again
------------------------------
GRANT SELECT,INSERT,UPDATE,DELETE ON dept TO .....;