2016-03-14 32 views
0

我需要检查完整的DLL。我需要一个SQL查询相同。我需要检查表结构与触发器,约束

如果我在Oracle中使用DESCDESCRIBE,它会向我显示所有列和类型。

但是我也需要所有的Constraints,Triggers作用于它等等。就像Oracle SQL Developer如果单击SQL选项卡时显示结构一样。

什么应该是我的查询命令?

回答

1

带约束的表定义:

select DBMS_METADATA.GET_DDL('TABLE', 'MY_TABLE') 
from dual; 

上表中的触发器:

select DBMS_METADATA.GET_DDL('TRIGGER',trigger_name) from user_triggers where table_name='MY_TABLE'; 
+0

我需要将这些数据放到.txt文件中。但有一些错误,它不会将完整的图片导出到我的txt文件上? http://stackoverflow.com/questions/35983994/oracle-spool-missing-complere-information –

1

对于约束:

Select constraint_name from all_constraints where table_name='Table_Name'; 

对于触发器:

select trigger_name from all_triggers where table_name='Table_Name'; 
+0

任何SQL它可以提供我并发症ete DLL? –

0

DBMS_METADATA包通常是检索对象DDL的最佳方法。

检索全部 DDL是一个挑战,因为有这么多不同类型的DDL。使用PL/SQL包和类型引用中的this long list of object types来选择必要的类型。有很多方法可以格式化结果并排除不同的设置。

在这个看似简单的任务上花费大量时间很容易。这是表格应该在版本控制的文本文件中“活”的原因之一,而不是数据库。您会发现使用DBMS_METADATA和类似方法始终如一地从数据库中获得完全相同的结果几乎是不可能的。

示例模式

create table test1(a number, constraint test1_pk primary key (a)); 
create or replace trigger trigger1 before insert on test1 
begin 
    null; 
end; 
/
grant select on test1 to system; 

代码以提取DDL

declare 
    v_clob clob; 
begin 
    --Add a semicolon at the end of each statement. 
    dbms_metadata.set_transform_param(dbms_metadata.session_transform, 'SQLTERMINATOR', true); 
    --Get DDL. 
    v_clob := v_clob || dbms_metadata.get_ddl('TABLE', 'TEST1', user); 
    v_clob := v_clob || dbms_metadata.get_dependent_ddl('TRIGGER', 'TEST1', user); 
    v_clob := v_clob || dbms_metadata.get_dependent_ddl('OBJECT_GRANT', 'TEST1', user); 
    --Print DDL (or insert it, save it to a file, etc.) 
    dbms_output.put_line(v_clob); 
end; 
/

结果

CREATE TABLE "JHELLER"."TEST1" 
    ( "A" NUMBER, 
    CONSTRAINT "TEST1_PK" PRIMARY KEY ("A") 
    USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 
    TABLESPACE "USERS" ENABLE 
    ) SEGMENT CREATION DEFERRED 
    PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 
NOCOMPRESS LOGGING 
    TABLESPACE "USERS" ; 
    CREATE OR REPLACE EDITIONABLE TRIGGER "JHELLER"."TRIGGER1" before insert on test1 
begin 
    null; 
end; 

/
ALTER TRIGGER "JHELLER"."TRIGGER1" ENABLE; 
    GRANT SELECT ON "JHELLER"."TEST1" TO "SYSTEM";