我需要检查完整的DLL。我需要一个sql查询。
如果我在Oracle中使用DESC
或DESCRIBE
,则会显示所有列和类型。
但是我还需要所有Constraints
,Triggers
代理它等等。就像Oracle SQL Developer在SQL
标签点击时显示结构一样。
我的查询命令应该是什么?
答案 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";