我需要检查具有触发器,约束的表结构

时间:2016-03-14 07:40:21

标签: sql oracle dll triggers

我需要检查完整的DLL。我需要一个sql查询。

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

但是我还需要所有ConstraintsTriggers代理它等等。就像Oracle SQL Developer在SQL标签点击时显示结构一样。

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

3 个答案:

答案 0 :(得分:1)

对于约束:

Select constraint_name from all_constraints where table_name='Table_Name';

对于触发器:

select trigger_name from all_triggers where table_name='Table_Name';

答案 1 :(得分: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';

答案 2 :(得分: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";