- 在9i中Oracle引入了flashback的概念,可以将数据返回到某个时间点,
- 但对于诸如drop/truncate等DDL语句却尚不支持。进入Oracle10g,这一
- 缺陷得到了弥补。可以将丢失掉的表,通过flashback命令直接找回。
- 非常简单且易用。
- 首先,可以查看当前schema中的表:
- SQL> select * from tab;
- TNAME TABTYPE CLUSTERID
- ------------------------ ------- ----------
- RECYCLETEST TABLE
- 然后删除该表:
- SQL> drop table recycletest;
- Table dropped.
- 检查表状态:
- SQL> select * from tab;
- TNAME TABTYPE CLUSTERID
- ------------------------------ ------- ----------
- BIN$04LhcpndanfgMAAAAAANPw==$0 TABLE
- 由此可知,Oracle将drop掉的表重命名了。而且对应的触发器,索引
- 等对象,所涉及到的表名,都已经对应修改。
- 假设现在有N个表都被drop掉了,那么如何查看被drop掉的表和在回收
- 站里面被重新命名后的名称呢?如下:
- SQL> show recyclebin
- ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
- ---------------- ------------------------------ ------------ ------------------
- RECYCLETEST BIN$04LhcpndanfgMAAAAAANPw==$0 TABLE 2004-02-16:21:13:31
- 或者:
- select * from dba_recyclebin;
- select * from user_recyclebin;
- 该命令需要在10g以上的版本的sqlplus中执行方可查看。
- 然后恢复该表:
- SQL> FLASHBACK TABLE RECYCLETEST TO BEFORE DROP;
- FLASHBACK COMPLETE.
- 可以看到删除的表已经被恢复了:
- SQL> SELECT * FROM TAB;
- TNAME TABTYPE CLUSTERID
- ------------------------------ ------- ----------
- RECYCLETEST TABLE
- 记住,将删除的表放在回收站中不会释放原有的表空间,要释放这些空
- 间,需要执行:
- purge recyclebin;
- 那么如果10g中要彻底删除一个表,而不要将该表回收放入回收站中呢:
- drop table recycletest purge;
- 由于drop一个表在Oracle中只是对该表重命名,而并没有迁移该表对应
- 的表空间,因此删除后的表如果没有purge,则会一直占用该表空间。
- 直到表空间不足时,Oracle首先会去回收站中按照先进先出的原则来清
- 理回收站中的表。
- 当然,也可以用手动的方式来清理指定的表:
- purge table recycletest;
- 或者使用该对象在回收站中的名字:
- purge table "BIN$04LhcpndanfgMAAAAAANPw==$0";
- 该命令将清除掉所有跟该表相关的对象,包括索引、约束、触发器等。如果想永
- 久的删除一个索引,则可以:
- purge index in_test_01;
- 这个命令仅仅删除该表的索引,而不影响该表(回收站中的)。
- 有一种情况,drop表emp后,又创建了emp表,然后再次drop后再创建emp表,再drop:
- create table emp(id number(10));
- drop table emp;
- create table emp(id number(10), name varchar2(100));
- drop table emp;
- create table emp(id number(10), name varchar2(100), sex varchar2(2));
- drop table emp;
- 当执行purge table emp后,是purge掉哪个表呢?还是全部purge掉?
- 答案是跟前面自动清理的原理一样,每次清除第一个被drop掉的emp表,判断的依据是user_recyclebin.dropscn,根据该值的大小决定purge的顺序。
- 另外,如果要对drop掉的表做恢复处理,而此时又已经创建了表emp,那么如何恢复该表呢(由于已经存在该表名,不能直接恢复)。方法:
- flashback table emp to before drop rename to emp_old;
- 即将恢复的表命名为其他名称的一个表。
- 恢复的时候跟purge的顺序是相反的,即最后一个被drop掉的最先被恢复。
3.关于查询数据库用户,权限的相关语句:
1.查看所有用户:
select * from dba_user;
select * from all_users;
select * from user_users;
2.查看用户系统权限:
select * from dba_sys_privs;
select * from all_sys_privs;
select * from user_sys_privs;
3.查看用户对象权限:
select * from dba_tab_privs;
select * from all_tab_privs;
select * from user_tab_privs;
4.查看所有角色:
select * from dba_roles;
5.查看用户所拥有的角色:
select * from dba_role_privs;
select * from user_role_privs;
4.几个经常用到的oracle视图:注意表名使用大写....................
1. 查询oracle中所有用户信息
6.查询全部索引
select * from user_indexes;
查询全部表格
5.查看当前数据库中正在执行的语句,然后可以继续做很多很多事情,例如查询执行计划等等
(1).查看相关进程在数据库中的会话
6.查询表的结构:表名大写!!
select t.COLUMN_NAME,
7.行列互换:
建立一个例子表:
CREATE TABLE t_col_row(
ID INT,
c1 VARCHAR2(10),
c2 VARCHAR2(10),
c3 VARCHAR2(10));
INSERT INTO t_col_row VALUES (1, 'v11', 'v21', 'v31');
INSERT INTO t_col_row VALUES (2, 'v12', 'v22', NULL);
INSERT INTO t_col_row VALUES (3, 'v13', NULL, 'v33');
INSERT INTO t_col_row VALUES (4, NULL, 'v24', 'v34');
INSERT INTO t_col_row VALUES (5, 'v15', NULL, NULL);
INSERT INTO t_col_row VALUES (6, NULL, NULL, 'v35');
INSERT INTO t_col_row VALUES (7, NULL, NULL, NULL);
COMMIT;
下面的是列转行:创建了一个视图
CREATE view v_row_col AS
SELECT id, 'c1' cn, c1 cv
FROM t_col_row
UNION ALL
SELECT id, 'c2' cn, c2 cv
FROM t_col_row
UNION ALL
SELECT id, 'c3' cn, c3 cv FROM t_col_row;
下面是创建了没有空值的一个竖表:
CREATE view v_row_col_notnull AS
SELECT id, 'c1' cn, c1 cv
where c1 is not null
UNION ALL
SELECT id, 'c2' cn, c2 cv
where c2 is not null
UNION ALL
SELECT id, 'c3' cn, c3 cv
where c3 is not null;
imp 用户名/密码@数据库 ignore=y file=备份文件 log=D:\DBtest\db_bak\imp.log
exp system/manager@TEST file=d:\daochu.dmp full=y
12.大对象字段blob:查看blob字段的大小:
13.下面收集的是有意思的sql语句,说不定正是你需要的:
--创建一个只允许在工作时间访问的视图
create or replace view newviewemp
as
select * from 表名
Create Or Replace Procedure My_Proc As
Sqlddl Varchar2(1000);
Begin
Sqlddl := 'create table MyTable(ID Number(5), Name Varchar2(20))';
Dbms_Output.Put_Line(Sqlddl);
Execute Immediate Sqlddl;
End;