2016-03-14 34 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";