- 浏览: 51330 次
- 性别:
- 来自: 合肥
-
文章分类
最新评论
1.oracle 安装完成后,会默认生成三个用户角色
sys 用户:超级管理员 权限最高 他的角色 dba 密码:chane-on-install (本人的已经改为pass)
system 用户:是系统管理员 权限也很高 她的角色是 dbaoper 密码:manager (本人该为pass)
scott 用户:普通用户 密码:tiger (本人改为woai5jia)
sys 与system
sys 有create database 的权限 而system 没有 其他相似
在日常对oracle管理过程中,使用system 就够了
权限 分为系统权限 和 对象权限;
系统权限:用户对数据库的相关权限
对象权限:用户对其他用户的数据对象操作的权限(比如表,视图,过程。。)
xiaoming 密码:m123;
xiaohong 密码:m1234;
在删除用户时,注意:如果要删除用户,已经创建了表,那么久需要在删除的时候带一个参数 cascade即把该用户及该用户创建的表删除(级联删除)
创建一个用户xiaoming 这个用户是没有任何权限的。比如登录 建表;
这时可以使用system 来赋予它这样的权限
如:grant connect to xiaoming
grant resource to xiaoming
还有比如实现xiaoing 对scott 中表的操作;
这时除了system sys 。scott 可以授权如:
查看emp表 如grant select on emp to xiaoming;
查看/增加/删除/修改 emp表 如grant all on emp to xiaoming;()
scott 收回xiaoming 对emp表的操作;
revoke select on emp from xiaoming:
虽然赋予了xiaomingselect的权限 但是在连接xiaoming 后使用select * from emp;还是查询不到
可以使用select * from scott.emp;这里就涉及到了“方案”的概念;
这里有desc 表名:是查看表结构;
//对权限的维护:如:希望xiaoming 用户可以去查询scott的emp表,还希望
xiaoming 可以把这个权限给别人
----如果是对象权限,就加入with grant option;
grant select on emp to xiaoming with grant option;
?如果scott 把xiaoming的select 权限回收了,那么xiaohong 的权限还在嘛:
答:同时被回收了
使用profile管理用户口令:
profile是口令限制,资源限制的命令集合。数据库建立时;oracle会自动建立名称为default的profile 。当建立用户没有指定profile选项。那么oracle会将defalt分配给用户
(1)账户锁定;
指定该账户登录时最多可以输入密码的次数,也可以指定用户锁定的时间(天),一般用dba 的身份去执行该命令。
如:
sql>create profile lockaaa limit failed_login_attempts 3 password_lock_time 2;
sql>alter user xiaoming profile lockaaa;
(2)给账户解锁
sql>alter user xiaoming account unlock;
(3)终结口令
为了让用户定期的修改密码可以使用终止口令的指令来完成。同样这个命令也需要dba身份来操作
如:给前面的创建的用户xiaoming创建一个profile文件,要求该用户每隔10天
要修改自家登录的密码,宽限期为2天
sql>create profile bbb1 limit password_life_time 10 password_grace_time 2;
sql>alter user xiaoming profile bbb1;
----口令历史
如果希望用户在修改密码时。不能使用以前使用过的密码。可使用口令历史,这样oracle就会将口令修改的信息存放在数据字典中,这样当用户修改密码时,oracle就会对新旧密码进行比较,当发现新旧密码不一样时。就提示用户重新输入密码、
如:sql>create profile ccc1 limit password_life_time
10 password_grace_time 2 password_reuse_time 10;
//password_reuse_time 指定口令可重用时间即10天后就可以重用
赋给某个用户
删除profile
sql>drop profile ccc[cascade]
-----oracle 表的管理:
1.必须以字母开头
2.数据类型
a.字符型:char 定长 最大2000字符//如果知道该字段经常被
查询并且是知道大概有多长这样使用char更好,效率更快 如:身份证号
b.varchar2() 变长 最大4000字符
c.clob ()最大字符达4G
3.数字型
number 可以表示整数 也可以表示小数
number(m,n)表示一个小数有m位有效数 n位小数
number(m) 表示一个m位整数
4.日期类型
date 包括年月日时分秒
timestamp 是对date类型的扩展
5 图片 视频等
blob 二进制数据 ,一般我们在数据库中只放视频图片的路径。如果需要安全的
考虑则可以考虑把他们放在数据库中
--建表
create table student(
stuId number(5),
stuName varchar2(10),
sal number(7,2)
);
添加字段
sql>alter table student add(classId number(2));
修改字段
sql>alter table student modify (stuId varchar2(10))
删除字段
sql>alter table student drop column sal;
删除表:
sql>drop table student;
注意:一般我们不做修改字段和删除字段的操作
添加数据
insert into student values(1,'小明','男','01-3月-1997',489.4,12);
在oracle中默认的日期格式是:dd-mm-yy ,月份后要加上“月”
如果要修改默认格式:
SQL> alter session set nls_date_format ='yyyy-MM-dd';
SQL> insert into student values(2,'小红','女','1988-7-6',489.4,12);
插入部分字段:insert into student (xh,xm,sex)values('','','');
空字段的增加和查询------
SQL> insert into student (xh,xm,sex,birthday) values(3,'aa','女',null);
select * from student where birthday is null;
修改一个字段
update student set sal = sal/2 where sex ='男'
修改多个字段;
update student set sex='男',birthday='1999-3-3' where xh = '0A';
删除数据:======
delete from student;//删除所有记录,表结构还在,写日志可以恢复数据,速度慢
一般情况下 我们开始会使用savepoint 保存点名 然后出现错误操作可以使用
rollback to 保存点名 来恢复到原来的位置。在不做处理的情况下,保存点就一个,再赋予一个就会覆盖前面的那个;
drop table student; //删除表的结构和数据
truncate table student;删除表中所有记录。表结构还在 不写日志无法找回删除的记录,但速度很快;
--------//clear 清屏命令;
数据库要求查询效率。所以在数据库中我们常常使用
insert into student (字段1,字段2.。。) select * from student
来实现一个数量巨大的表供我们进行测试;
表单查询------
取消重复行:使用distinct关键字
select 语句中对于传入的内容是区分大小写的;
select ename,joB,sAl from emp where ename ='SMITH';
对于null值的处理;-------
SQL> select ename,13*sal+13*comm,comm from emp;//oracle中规定当某个字段中的值为null时,使用该值计算的结果也为null;
为了避免上上面的发生:可以使用nvl()函数
如:SQL> select ename,13*sal+13*nvl(comm,0) "年薪",comm from emp;
即当comm为null时会使用0代替,不为null 使用本身计算
注意在查询日期的时候,不要忘了oracle本身默认时间的格式:
SQL> select ename,hiredate from emp where hiredate >'3-3月-1983';
group by和having 使用;
//group by 用于对查询的结果分组统计
//having 子句用户限制分组显示结果
SQL> select min(sal),avg(sal),max(sal), deptno from emp group by deptno;
MIN(SAL) AVG(SAL) MAX(SAL) DEPTNO
---------- ---------- ---------- ------
1300 2916.66666 5000 10
800 2175 3000 20
950 1566.66666 2850 30
-------------------------------------
SQL> select min(sal),avg(sal),max(sal), deptno from emp group by deptno having avg(sal)>2000;
MIN(SAL) AVG(SAL) MAX(SAL) DEPTNO
---------- ---------- ---------- ------
1300 2916.66666 5000 10
800 2175 3000 20
数据分组总结:
1.分组函数只能出现在选择列表 having order by 子句中。
2.如果在select 语句中同时包含有group by ,having,order by 那么他们的顺序
一定是group by ,having, order by
如:SQL> select min(sal),avg(sal),max(sal), deptno from emp group by deptno having avg(sal)>2000 order by avg(sal);
MIN(SAL) AVG(SAL) MAX(SAL) DEPTNO
---------- ---------- ---------- ------
800 2175 3000 20
1300 2916.66666 5000 10
3.在选择列中如果有列,表达式,和分组函数,那么这些列和表达式必须有一个出现在group by 子句中,否则会出错;
多表查询:
1.查询匹配的多列子查询
与simth的工作岗位,部门号都相同的所有员工!
select * from emp where(deptno,job)=(select deptno,job from emp where ename='SMITH');
2.查询比自己部门平均工资高的员工信息。
逻辑要很清晰
i.查询出所有部门的平均工资
select deptno,avg(sal) from emp group by deptno;
在这里我们有一个需要特别注意的就是可以把上面得出的结果看做是一张子表
ii。查询得出结果!
select a1.ename,a1.sal,a2.mysal from emp a1,(select deptno,avg(sal) mysal from emp group by deptno) a2 where a1.deptno=a2.deptno and a1.sal>a2.mysal;
3.接下来讲到oracle中的重点:分页技术,一共有三种方式(见图)
i.rownum分页
(select * from emp)
ii.显示rownum 【注意这里的rownum是oracle分配的,并且只能识别一次】
select a1.*,rownum rn from(select * from emp) a1;
比如查询前十行记录:select a1.*,rownum rn from(select * from emp) a1 where rownum<=10;
但是这样写就会查不出来:
select a1.*,rownum rn from(select * from emp) a1 where rownum<=10 and rownum>=6(原因上面说了,oracle规定rownum 只能在一个条件中使用一次)
如果做过项目的知道。在分页中,我们经常使用到:pageNow pageSize pageCount
rowCount
所以在oracle 中我们也向其他查询一样
把10换成【pageNow*pageSize】
把6换成【((pageNow-1)*pageSize+1)】
所以要完成上面的功能还需要第三次子查询;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO RN
----- ---------- --------- ----- ----------- --------- --------- ------ ----------
7369 SMITH CLERK 7902 1980-12-17 800.00 20 1
7499 ALLEN SALESMAN 7698 1981-2-20 1600.00 300.00 30 2
7521 WARD SALESMAN 7698 1981-2-22 1250.00 500.00 30 3
7566 JONES MANAGER 7839 1981-4-2 2975.00 20 4
7654 MARTIN SALESMAN 7698 1981-9-28 1250.00 1400.00 30 5
7698 BLAKE MANAGER 7839 1981-5-1 2850.00 30 6
7782 CLARK MANAGER 7839 1981-6-9 2450.00 10 7
7788 SCOTT ANALYST 7566 1987-4-19 3000.00 20 8
7839 KING PRESIDENT 1981-11-17 5000.00 10 9
7844 TURNER SALESMAN 7698 1981-9-8 1500.00 0.00 30 10
iii.select * from(select a1.*,rownum rn from(select * from emp) a1 where rownum<=10) a1 where rn>=6 ;(注前面前十行查出来了后,rownum字段是rn,所以在第三步中的查询条件要使用rn)
4.几个条件的变化(都是修改最底层的select 子句)
a.需要查询的字段
select * from(select a1.*,rownum rn from(select ename,empno,deptno from emp) a1 where rownum<=10) a1 where rn>=6;
b.排序
select * from(select a1.*,rownum rn from(select ename,empno,sal from emp order by sal) a1 where rownum<=10) a1 where rn>=6;
4.用查询的结果创建一个新表;
create table mytable (id,name,sal) as select empno,ename,sal from emp;
复杂查询:合并查询
有时候,在实际应用中,为了合并多个select语句查询的结果,可以使用集合操作符
union , all union,insersect,minus
a.union 该操作符是用于取得两个操作集的并集,使用该操作符会自动去掉结果集中的重复行;
select ename,sal,job from emp where sal>2500 union
select ename,sal,job from emp where job='MANAGER';
b.union all 和上面的union相似,只是不消除重复行
c.insersect 指的是取得两个结果集的交集
d.minus 指的是两个集合的差集;
下面介绍几个小技巧:
to_date函数:当插入一个日期时,我们知道oracle默认是:dd-mm月-yyyy;
为了方便插入格式匹配,我们可以是该函数;
当然使用默认插入也是可以自动转化成yyyy-MM-dd的格式
但是还在这里说下该函数的使用方法。
insert into emp values(3,'邓言诚','manager',7782,to_date('1988/2/18','yyyy/MM/dd/'),789,77,10);
我试了一下,yyyy年MM月dd日的格式好像不可以!
一次插入多行记录:
a.上面我提到了一种方法感觉很好
create table mytable (id,name,sal) as select empno,ename,sal from emp;
b.下面的这种方法其实和上面的差不多;
create table mytable1(id number(5),name varchar2(10),job varchar2(20));
先创建后在给表赋值
insert into mytable1(id,name,job) select empno,ename,job from emp where deptno=10;
更新多列数据:
其实上面也有讲过类似的方法:
更新表中SMITH的工资,职位,奖金和SCOTT 一样;
update emp set (sal,job,comm)=(select sal,job,comm from emp where ename='SMITH') where ename='SCOTT';
事务处理:
前面也提到过保存点(savepoint),一般我们在进入数据库操作时,都会设置一个保存点。
a.提交事务,当执行使用commit语句可以提交事务。执行commit语句之后,会确认失事务的变化,结束事务,删除保存点,释放锁。当使用commit语句结束事务后,其他会话将可以查看到事务变化后的新数据。当然不手动的提交事务,使用exit会自动提交,所以建议大家养成手动提交事务的习惯。
那么,我写个小程序,使用java来提交事务(自己导入包,打开服务端口)
package com.demon;
import java.sql.*;
public class TestTransaction {
public static void main(String[] args) {
Connection ct=null;
Statement sm =null;
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
ct =DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:ORCL","scott","woai5jia");
sm = ct.createStatement();
System.out.println("0...");
//从scott中减去100
//加入事务处理
ct.setAutoCommit(false);
sm.executeUpdate("update emp set sal=sal-100 where ename='SCOTT'");
System.out.println("1...");
int i = 4/0;//当然这里只是举个列子,出现异常有很多种
//从smith中加上100
sm.executeUpdate("update emp set sal=sal-100 where ename='SMITH'");
//提交事务
ct.commit();
sm.close();
ct.close();
} catch (Exception e) {
try {
//出现异常等 回滚事务
ct.rollback();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
e.printStackTrace();
}
}
}
b.只读事务; set transaction read only;
定义不是很好理解,我就用日常事务来说明一下它的用途:比如春节买火车票,售票管理员每隔一段时间就会查看售票情况。假如是每天18:00 统计售票情况,但是在此时,售票还在一直进行,不可能管理员统计就停止售票,所以这时使用只读事务的意义就显现出来了,但管理员在18:00这个时刻设置了只读事务,而售票人员还在进行售票。这时候,管理员查看的只是18:00之前的售票情况。
下面就以oracle自带的 system 和scott 来演示一下:
比如此时system 进入数据库 设置了只读事务:
然后,scott也进入数据库进行数据的操作
操作完成后,scott可以查看到自己操作后的结果,如:scott插入了几个雇员
而system 查找emp 表时却看不到该表被scott操作后的结果;
(select * from scott.emp 注意system查询时使用该形式,因为它要查询的是scott中的emp 表 这个我有时也容易忽略)
oracle 中sql 函数:
1.字符函数(把emp中的ename 转化成第一个小写剩余字母大写的形式)
select lower(substr(ename,1,1))|| substr(ename,2,length(ename)-1) from emp;
这里我就不多说了,试下就行了,这里的“ || ”是合并两个字符串。
还有很多replace 如:select replace(ename,'A','我是邓言诚') from emp;
2.数学函数
round(n,[m])该函数是四舍五入 m省略则得到整数
trunc(n,[m])截取一个数,省略m 则忽略小数
mod(n,m) 求余;
这里给出一个虚拟表 dual ,用于函数测试;
如:SQL> select mod(10,2) from dual;
MOD(10,2)
----------
0
--------------------------------------------------
floor(m),得到一个比m小的最大整数 如:floor(33.3)--->33
ceil(m),得到一个比m大的最小整数 如:ceil(44.2)--->45
还有其他数学函数 abs(),sin(),cos() power()......
3.日期函数
a.当期日期
SQL> select sysdate from dual;
SYSDATE
-----------
2011-6-19 0
b.addmouths(d,n);指d 加上n个月后的日期
如:得出从受雇距今超过30年的员工信息
select * from emp where sysdate>add_months(hiredate,30*12);
c.在oracle中可以利用时间想减得到天数:但因为小时的关系,可以忽略
select floor(sysdate-hiredate),ename from emp;
d.last_day(d);得到这个日期下,该月的最后一天。
SQL> select last_day(sysdate) from dual;
LAST_DAY(SYSDATE)
-----------------
2011-6-30 0:17:57
如:各月倒数第3天入职的员工信息;
select * from emp where hiredate=last_day(hiredate)-2;
4.转换函数
虽然oracle中有自动转化功能,但有时候有的还是需要进行转化;
这里我说下to_char();该函数功能很广泛,可用于日期也可以用于薪水;
insert into emp values(100,'邓言诚','MANAGER',7566,sysdate,3232,324,10);
然后查询:SQL> select ename,to_char(hiredate,'yyyy-MM-dd HH24:mi:ss') "入职时间",to_char(sal,'L99,999.99') "薪资" from emp where empno=100;
ENAME 入职时间 薪资
---------- ------------------- --------------------
邓言诚 2011-06-19 00:44:01 ¥3,232.00
这里注意下:当使用别名时,使用中文要使用“”括起来,''不行。
就查询语句中的日期格式我就不说了,我来说下薪资的格式
L ---》表示当地的货币类型;
99,999.99---》小数点前表示整数,小数点后表示小数。至于前面的<,> 大家取钱都见过这种格式吧!还有就是数据要根据你创建表示的格式而定,如该emp表:sal number(7,2);
如果要使用国际货币则使用“$”....(把L换成相应的国际货币符号就可以了)
5.系统函数
a.terminal:当前会话客户所对应的终端的标示符
b.language :语言
c.db_name:当前数据库名称
d.nls_date_format;当前会话客户对应的日期格式
e.session_user:会话客户所对应的数据库用户名
f.current_schema:当前会话客户对应的默认方案名?
g.host:返回数据库所在主句名称
select sys_context('userenv','db_name') from dual;这里的userenv是用户所处环境
数据库管理员:
1.管理数据库的用户主要是sys 和system,他们的主要区别是:
(1)最重要的区别:存储的数据的重要性不同。
sys:所有oracle的数据字典的基表和视图都存放在sys用户中,这些基表和视图对于oracle的运行至关重要。由数据库自己维护,任何用户都不能手动更改。sys用户拥有dba,sysdba,sysoper角色或权限,是oracle权限最高的用户。
system:用于存放次级的内部数据;如oracle的一些特性或工具管理信息。system用户拥有dba,sysdab角色或系统权限。
(2)其次区别:权限不同。
sys用户必须以as sysdba 或as syspoer形式登陆,不能以normal方式登陆数据库
system如果正常登陆。它其实就是一个普通的dba用户,但是如果以as sysdba登陆,其结果实际上它是作为sys用户登录的。(见附图)
2.数据库的逻辑备份(到出)和恢复(导入)【注意在导入和导出要在oracle安装目录的BIN 下进行】
导出表:
a.导出自己的表:(见附图)
E:\oracle\product\10.1.0\Db_1\BIN>exp userid=scott/woai5jia@ORCL tables=(emp) fi
le=d:\emp1.dmp
b.导出其他方案的表:在这个提下方案,一个用户的创建就会生成对应一个和用户名相同的方案;
E:\oracle\product\10.1.0\Db_1\BIN>exp userid=system/pass@ORCL tables=(scott.emp) fi
le=d:\emp2.dmp
c.导出表结构
E:\oracle\product\10.1.0\Db_1\BIN>exp userid=scott/woai5jia@ORCL tables=(emp) fi
le=d:\emp3.dmp rows=n
d.直接导出方式,这种方式导入速度快,当数据量很大的时候可以考虑使用该方式
E:\oracle\product\10.1.0\Db_1\BIN>exp userid=scott/woai5jia@ORCL tables=(emp) fi
le=d:\emp4.dmp direct=y
导出方案:
a.导出自己方案
exp userid=scott/woai5jia@ORCL owner=scott file=d:\emp5.dmp
b.导出其他方案
exp userid=system/pass@ORCL owner=(system,scott) file=d:\emp6.dmp[这里表示用system用户导出自己的方案并导出scott方案]
导出数据库:【要求该用户具有dba权限或是exp_full_datebase权限】
exp userid=scott/woai5jia@ORCL full=y inctype=complete file=d:\emp7.dmp(inctype 表示增量备份)
导入表 和上面的对应
a.导入自己的表
imp userid=scott/woai5jia@ORCL tables=(emp) file=d:\emp.dmp;
b.导入表到其他用户
imp userid=system/pass@ORCL tables=(emp) file=d:\xx.dmp touser=scott;
c.导入表结构,只导入结构不导入数据
imp userid=scott/woai5jia@ORCL tables=(emp) file=d:\emp1.dmp rows=n;
d.导入数据:如果对象(如表)已经存在,则只导入数据
imp userid=scott/woai5jia@ORCL tables=(emp) file=d:\xxx.dmp ignore=y;
导入方案:
a.导入自身方案
imp userid=scott/woai5jia@ORCL file=d:\emp4.dmp;
b.导入其他方案【还是需要拥有dba身份】
imp userid=system/pass@ORCL file=d:\emp4.dmp fromuser=system touser=scott;
导入数据库
imp userid=system/pass full=y file=d:\xxxx.dmp;
--------------------------------------------------------------------------
* 注意以上的导入导出要对应相应的.dmp 我在这里只是把功能列出来,没有具体对应。应为我当时建的时候
没有标记dmp所对应的表
------------------------------------------------------------------------
前面介绍了当创建一个用户就会生成一个与之名称相对应得方案,其中方案中就包含下面的数据字典和动态性能视图。。。。。
数据字典 和动态性能视图
数据字典:在oracle中提供了数据库的一些系统信息,是静态的数据
动态性能视图: 记载了例程启动后的相关信息,是动态数据
数据字典视图:
(1)user_tables;用于显示当前用户所拥有的所有表,它只返回所对应方案的所有表
select table_name from user_tables;
(2)all_tables :用于显示当前用户可以访问的所有表,不仅返回当前用户方案表,还可以返回当前用户可以访问的其他方案表 select table_name from all_tables;
(3) dba_tables 它显示所有方案所有的数据库表,但是查询这种数据库字典
视图。要求用户必须是dba角色或是select any table 系统权限
SQL> conn system/pass;
Connected to Oracle Database 10g Enterprise Edition Release 10.1.0.2.0
Connected as system
SQL> select table_name from dba_tables;
重要查询:
//通过dba_users可以显示所有数据库用户的消息信息
select username,password from dba_users;
//通过查询数据字典视图dba_sys_privs,可以显示用户所具有的系统权限
SQL> desc dba_role_privs;
Name Type Nullable Default Comments
------------ ------------ -------- ------- -------------------------------------------------
GRANTEE VARCHAR2(30) Y Grantee Name, User or Role receiving the grant
GRANTED_ROLE VARCHAR2(30) Granted role name
ADMIN_OPTION VARCHAR2(3) Y Grant was with the ADMIN option
DEFAULT_ROLE VARCHAR2(3) Y Role is designated as a DEFAULT ROLE for the user
SQL> select * from dba_role_privs where GRANTEE='SCOTT';
GRANTEE GRANTED_ROLE ADMIN_OPTION DEFAULT_ROLE
------------------------------ ------------------------------ ------------ ------------
SCOTT CONNECT NO YES
SCOTT RESOURCE NO YES
//通过查询数据库字典dba_role_privs 可以显示用户所具有的角色
select * from dba_role_privs;
//如何查询一个角色包括的权限?
a.一个角色包含系统权限
select * from dba_sys_privs where grantee= 'CONNECT';
另外也可这样查看
SQL> conn system/pass as sysdba;
Connected to Oracle Database 10g Enterprise Edition Release 10.1.0.2.0
Connected as SYS
SQL> select * from role_sys_privs where role='CONNECT';
ROLE PRIVILEGE ADMIN_OPTION
------------------------------ ---------------------------------------- ------------
CONNECT CREATE VIEW NO
CONNECT CREATE TABLE NO
CONNECT ALTER SESSION NO
CONNECT CREATE CLUSTER NO
CONNECT CREATE SESSION NO
CONNECT CREATE SYNONYM NO
CONNECT CREATE SEQUENCE NO
CONNECT CREATE DATABASE LINK NO
b.一个角色包含党的对象权限
select * from dba_tab_privs where grantee='CONNECT';
//查询某个用户具有怎样的角色
select * from dba_role_privs where grantee='SCOTT';
//查询oracle中所有的系统权限。一般是dba
select * from system_privilege_map order by name;
//查询oracle中所有的角色,一般是dba
select * from dba_roles;
//查询oracle中所有对象权限,一般是dba
select distinct privilege from dba_tab_privs;
//查询数据库的表空间
select tablespace_name from dba_tablespaces;
//查看当前数据库
SQL> select * from global_name;
GLOBAL_NAME
--------------------------------------------------------------------------------
ORCL
下面总结下:一个用户拥有多个角色,一个角色是多个权限的集合;
管理表空间和数据文件*****
表空间是数据库的逻辑组成部分,从物理上讲,数据库数据(如表等)存放在数据文件中,从逻辑上讲,数据库则是存放在表空间中,表空间由一个或多个数据文件组成(见附图),所以我们通过操作表空间来操作表文件!
表空间:表空间用于逻辑上组织数据库的数据,数据库逻辑上是有一个或是多个表空间组成。通过表空间可以达到以下作用a.控制数据库占用的磁盘空间b.dba 可以将不同数据类型部署到不同的位置,这样有利于提高I/O性能,同时利于备份和恢复等管理操作。
sys 用户:超级管理员 权限最高 他的角色 dba 密码:chane-on-install (本人的已经改为pass)
system 用户:是系统管理员 权限也很高 她的角色是 dbaoper 密码:manager (本人该为pass)
scott 用户:普通用户 密码:tiger (本人改为woai5jia)
sys 与system
sys 有create database 的权限 而system 没有 其他相似
在日常对oracle管理过程中,使用system 就够了
权限 分为系统权限 和 对象权限;
系统权限:用户对数据库的相关权限
对象权限:用户对其他用户的数据对象操作的权限(比如表,视图,过程。。)
xiaoming 密码:m123;
xiaohong 密码:m1234;
在删除用户时,注意:如果要删除用户,已经创建了表,那么久需要在删除的时候带一个参数 cascade即把该用户及该用户创建的表删除(级联删除)
创建一个用户xiaoming 这个用户是没有任何权限的。比如登录 建表;
这时可以使用system 来赋予它这样的权限
如:grant connect to xiaoming
grant resource to xiaoming
还有比如实现xiaoing 对scott 中表的操作;
这时除了system sys 。scott 可以授权如:
查看emp表 如grant select on emp to xiaoming;
查看/增加/删除/修改 emp表 如grant all on emp to xiaoming;()
scott 收回xiaoming 对emp表的操作;
revoke select on emp from xiaoming:
虽然赋予了xiaomingselect的权限 但是在连接xiaoming 后使用select * from emp;还是查询不到
可以使用select * from scott.emp;这里就涉及到了“方案”的概念;
这里有desc 表名:是查看表结构;
//对权限的维护:如:希望xiaoming 用户可以去查询scott的emp表,还希望
xiaoming 可以把这个权限给别人
----如果是对象权限,就加入with grant option;
grant select on emp to xiaoming with grant option;
?如果scott 把xiaoming的select 权限回收了,那么xiaohong 的权限还在嘛:
答:同时被回收了
使用profile管理用户口令:
profile是口令限制,资源限制的命令集合。数据库建立时;oracle会自动建立名称为default的profile 。当建立用户没有指定profile选项。那么oracle会将defalt分配给用户
(1)账户锁定;
指定该账户登录时最多可以输入密码的次数,也可以指定用户锁定的时间(天),一般用dba 的身份去执行该命令。
如:
sql>create profile lockaaa limit failed_login_attempts 3 password_lock_time 2;
sql>alter user xiaoming profile lockaaa;
(2)给账户解锁
sql>alter user xiaoming account unlock;
(3)终结口令
为了让用户定期的修改密码可以使用终止口令的指令来完成。同样这个命令也需要dba身份来操作
如:给前面的创建的用户xiaoming创建一个profile文件,要求该用户每隔10天
要修改自家登录的密码,宽限期为2天
sql>create profile bbb1 limit password_life_time 10 password_grace_time 2;
sql>alter user xiaoming profile bbb1;
----口令历史
如果希望用户在修改密码时。不能使用以前使用过的密码。可使用口令历史,这样oracle就会将口令修改的信息存放在数据字典中,这样当用户修改密码时,oracle就会对新旧密码进行比较,当发现新旧密码不一样时。就提示用户重新输入密码、
如:sql>create profile ccc1 limit password_life_time
10 password_grace_time 2 password_reuse_time 10;
//password_reuse_time 指定口令可重用时间即10天后就可以重用
赋给某个用户
删除profile
sql>drop profile ccc[cascade]
-----oracle 表的管理:
1.必须以字母开头
2.数据类型
a.字符型:char 定长 最大2000字符//如果知道该字段经常被
查询并且是知道大概有多长这样使用char更好,效率更快 如:身份证号
b.varchar2() 变长 最大4000字符
c.clob ()最大字符达4G
3.数字型
number 可以表示整数 也可以表示小数
number(m,n)表示一个小数有m位有效数 n位小数
number(m) 表示一个m位整数
4.日期类型
date 包括年月日时分秒
timestamp 是对date类型的扩展
5 图片 视频等
blob 二进制数据 ,一般我们在数据库中只放视频图片的路径。如果需要安全的
考虑则可以考虑把他们放在数据库中
--建表
create table student(
stuId number(5),
stuName varchar2(10),
sal number(7,2)
);
添加字段
sql>alter table student add(classId number(2));
修改字段
sql>alter table student modify (stuId varchar2(10))
删除字段
sql>alter table student drop column sal;
删除表:
sql>drop table student;
注意:一般我们不做修改字段和删除字段的操作
添加数据
insert into student values(1,'小明','男','01-3月-1997',489.4,12);
在oracle中默认的日期格式是:dd-mm-yy ,月份后要加上“月”
如果要修改默认格式:
SQL> alter session set nls_date_format ='yyyy-MM-dd';
SQL> insert into student values(2,'小红','女','1988-7-6',489.4,12);
插入部分字段:insert into student (xh,xm,sex)values('','','');
空字段的增加和查询------
SQL> insert into student (xh,xm,sex,birthday) values(3,'aa','女',null);
select * from student where birthday is null;
修改一个字段
update student set sal = sal/2 where sex ='男'
修改多个字段;
update student set sex='男',birthday='1999-3-3' where xh = '0A';
删除数据:======
delete from student;//删除所有记录,表结构还在,写日志可以恢复数据,速度慢
一般情况下 我们开始会使用savepoint 保存点名 然后出现错误操作可以使用
rollback to 保存点名 来恢复到原来的位置。在不做处理的情况下,保存点就一个,再赋予一个就会覆盖前面的那个;
drop table student; //删除表的结构和数据
truncate table student;删除表中所有记录。表结构还在 不写日志无法找回删除的记录,但速度很快;
--------//clear 清屏命令;
数据库要求查询效率。所以在数据库中我们常常使用
insert into student (字段1,字段2.。。) select * from student
来实现一个数量巨大的表供我们进行测试;
表单查询------
取消重复行:使用distinct关键字
select 语句中对于传入的内容是区分大小写的;
select ename,joB,sAl from emp where ename ='SMITH';
对于null值的处理;-------
SQL> select ename,13*sal+13*comm,comm from emp;//oracle中规定当某个字段中的值为null时,使用该值计算的结果也为null;
为了避免上上面的发生:可以使用nvl()函数
如:SQL> select ename,13*sal+13*nvl(comm,0) "年薪",comm from emp;
即当comm为null时会使用0代替,不为null 使用本身计算
注意在查询日期的时候,不要忘了oracle本身默认时间的格式:
SQL> select ename,hiredate from emp where hiredate >'3-3月-1983';
group by和having 使用;
//group by 用于对查询的结果分组统计
//having 子句用户限制分组显示结果
SQL> select min(sal),avg(sal),max(sal), deptno from emp group by deptno;
MIN(SAL) AVG(SAL) MAX(SAL) DEPTNO
---------- ---------- ---------- ------
1300 2916.66666 5000 10
800 2175 3000 20
950 1566.66666 2850 30
-------------------------------------
SQL> select min(sal),avg(sal),max(sal), deptno from emp group by deptno having avg(sal)>2000;
MIN(SAL) AVG(SAL) MAX(SAL) DEPTNO
---------- ---------- ---------- ------
1300 2916.66666 5000 10
800 2175 3000 20
数据分组总结:
1.分组函数只能出现在选择列表 having order by 子句中。
2.如果在select 语句中同时包含有group by ,having,order by 那么他们的顺序
一定是group by ,having, order by
如:SQL> select min(sal),avg(sal),max(sal), deptno from emp group by deptno having avg(sal)>2000 order by avg(sal);
MIN(SAL) AVG(SAL) MAX(SAL) DEPTNO
---------- ---------- ---------- ------
800 2175 3000 20
1300 2916.66666 5000 10
3.在选择列中如果有列,表达式,和分组函数,那么这些列和表达式必须有一个出现在group by 子句中,否则会出错;
多表查询:
1.查询匹配的多列子查询
与simth的工作岗位,部门号都相同的所有员工!
select * from emp where(deptno,job)=(select deptno,job from emp where ename='SMITH');
2.查询比自己部门平均工资高的员工信息。
逻辑要很清晰
i.查询出所有部门的平均工资
select deptno,avg(sal) from emp group by deptno;
在这里我们有一个需要特别注意的就是可以把上面得出的结果看做是一张子表
ii。查询得出结果!
select a1.ename,a1.sal,a2.mysal from emp a1,(select deptno,avg(sal) mysal from emp group by deptno) a2 where a1.deptno=a2.deptno and a1.sal>a2.mysal;
3.接下来讲到oracle中的重点:分页技术,一共有三种方式(见图)
i.rownum分页
(select * from emp)
ii.显示rownum 【注意这里的rownum是oracle分配的,并且只能识别一次】
select a1.*,rownum rn from(select * from emp) a1;
比如查询前十行记录:select a1.*,rownum rn from(select * from emp) a1 where rownum<=10;
但是这样写就会查不出来:
select a1.*,rownum rn from(select * from emp) a1 where rownum<=10 and rownum>=6(原因上面说了,oracle规定rownum 只能在一个条件中使用一次)
如果做过项目的知道。在分页中,我们经常使用到:pageNow pageSize pageCount
rowCount
所以在oracle 中我们也向其他查询一样
把10换成【pageNow*pageSize】
把6换成【((pageNow-1)*pageSize+1)】
所以要完成上面的功能还需要第三次子查询;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO RN
----- ---------- --------- ----- ----------- --------- --------- ------ ----------
7369 SMITH CLERK 7902 1980-12-17 800.00 20 1
7499 ALLEN SALESMAN 7698 1981-2-20 1600.00 300.00 30 2
7521 WARD SALESMAN 7698 1981-2-22 1250.00 500.00 30 3
7566 JONES MANAGER 7839 1981-4-2 2975.00 20 4
7654 MARTIN SALESMAN 7698 1981-9-28 1250.00 1400.00 30 5
7698 BLAKE MANAGER 7839 1981-5-1 2850.00 30 6
7782 CLARK MANAGER 7839 1981-6-9 2450.00 10 7
7788 SCOTT ANALYST 7566 1987-4-19 3000.00 20 8
7839 KING PRESIDENT 1981-11-17 5000.00 10 9
7844 TURNER SALESMAN 7698 1981-9-8 1500.00 0.00 30 10
iii.select * from(select a1.*,rownum rn from(select * from emp) a1 where rownum<=10) a1 where rn>=6 ;(注前面前十行查出来了后,rownum字段是rn,所以在第三步中的查询条件要使用rn)
4.几个条件的变化(都是修改最底层的select 子句)
a.需要查询的字段
select * from(select a1.*,rownum rn from(select ename,empno,deptno from emp) a1 where rownum<=10) a1 where rn>=6;
b.排序
select * from(select a1.*,rownum rn from(select ename,empno,sal from emp order by sal) a1 where rownum<=10) a1 where rn>=6;
4.用查询的结果创建一个新表;
create table mytable (id,name,sal) as select empno,ename,sal from emp;
复杂查询:合并查询
有时候,在实际应用中,为了合并多个select语句查询的结果,可以使用集合操作符
union , all union,insersect,minus
a.union 该操作符是用于取得两个操作集的并集,使用该操作符会自动去掉结果集中的重复行;
select ename,sal,job from emp where sal>2500 union
select ename,sal,job from emp where job='MANAGER';
b.union all 和上面的union相似,只是不消除重复行
c.insersect 指的是取得两个结果集的交集
d.minus 指的是两个集合的差集;
下面介绍几个小技巧:
to_date函数:当插入一个日期时,我们知道oracle默认是:dd-mm月-yyyy;
为了方便插入格式匹配,我们可以是该函数;
当然使用默认插入也是可以自动转化成yyyy-MM-dd的格式
但是还在这里说下该函数的使用方法。
insert into emp values(3,'邓言诚','manager',7782,to_date('1988/2/18','yyyy/MM/dd/'),789,77,10);
我试了一下,yyyy年MM月dd日的格式好像不可以!
一次插入多行记录:
a.上面我提到了一种方法感觉很好
create table mytable (id,name,sal) as select empno,ename,sal from emp;
b.下面的这种方法其实和上面的差不多;
create table mytable1(id number(5),name varchar2(10),job varchar2(20));
先创建后在给表赋值
insert into mytable1(id,name,job) select empno,ename,job from emp where deptno=10;
更新多列数据:
其实上面也有讲过类似的方法:
更新表中SMITH的工资,职位,奖金和SCOTT 一样;
update emp set (sal,job,comm)=(select sal,job,comm from emp where ename='SMITH') where ename='SCOTT';
事务处理:
前面也提到过保存点(savepoint),一般我们在进入数据库操作时,都会设置一个保存点。
a.提交事务,当执行使用commit语句可以提交事务。执行commit语句之后,会确认失事务的变化,结束事务,删除保存点,释放锁。当使用commit语句结束事务后,其他会话将可以查看到事务变化后的新数据。当然不手动的提交事务,使用exit会自动提交,所以建议大家养成手动提交事务的习惯。
那么,我写个小程序,使用java来提交事务(自己导入包,打开服务端口)
package com.demon;
import java.sql.*;
public class TestTransaction {
public static void main(String[] args) {
Connection ct=null;
Statement sm =null;
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
ct =DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:ORCL","scott","woai5jia");
sm = ct.createStatement();
System.out.println("0...");
//从scott中减去100
//加入事务处理
ct.setAutoCommit(false);
sm.executeUpdate("update emp set sal=sal-100 where ename='SCOTT'");
System.out.println("1...");
int i = 4/0;//当然这里只是举个列子,出现异常有很多种
//从smith中加上100
sm.executeUpdate("update emp set sal=sal-100 where ename='SMITH'");
//提交事务
ct.commit();
sm.close();
ct.close();
} catch (Exception e) {
try {
//出现异常等 回滚事务
ct.rollback();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
e.printStackTrace();
}
}
}
b.只读事务; set transaction read only;
定义不是很好理解,我就用日常事务来说明一下它的用途:比如春节买火车票,售票管理员每隔一段时间就会查看售票情况。假如是每天18:00 统计售票情况,但是在此时,售票还在一直进行,不可能管理员统计就停止售票,所以这时使用只读事务的意义就显现出来了,但管理员在18:00这个时刻设置了只读事务,而售票人员还在进行售票。这时候,管理员查看的只是18:00之前的售票情况。
下面就以oracle自带的 system 和scott 来演示一下:
比如此时system 进入数据库 设置了只读事务:
然后,scott也进入数据库进行数据的操作
操作完成后,scott可以查看到自己操作后的结果,如:scott插入了几个雇员
而system 查找emp 表时却看不到该表被scott操作后的结果;
(select * from scott.emp 注意system查询时使用该形式,因为它要查询的是scott中的emp 表 这个我有时也容易忽略)
oracle 中sql 函数:
1.字符函数(把emp中的ename 转化成第一个小写剩余字母大写的形式)
select lower(substr(ename,1,1))|| substr(ename,2,length(ename)-1) from emp;
这里我就不多说了,试下就行了,这里的“ || ”是合并两个字符串。
还有很多replace 如:select replace(ename,'A','我是邓言诚') from emp;
2.数学函数
round(n,[m])该函数是四舍五入 m省略则得到整数
trunc(n,[m])截取一个数,省略m 则忽略小数
mod(n,m) 求余;
这里给出一个虚拟表 dual ,用于函数测试;
如:SQL> select mod(10,2) from dual;
MOD(10,2)
----------
0
--------------------------------------------------
floor(m),得到一个比m小的最大整数 如:floor(33.3)--->33
ceil(m),得到一个比m大的最小整数 如:ceil(44.2)--->45
还有其他数学函数 abs(),sin(),cos() power()......
3.日期函数
a.当期日期
SQL> select sysdate from dual;
SYSDATE
-----------
2011-6-19 0
b.addmouths(d,n);指d 加上n个月后的日期
如:得出从受雇距今超过30年的员工信息
select * from emp where sysdate>add_months(hiredate,30*12);
c.在oracle中可以利用时间想减得到天数:但因为小时的关系,可以忽略
select floor(sysdate-hiredate),ename from emp;
d.last_day(d);得到这个日期下,该月的最后一天。
SQL> select last_day(sysdate) from dual;
LAST_DAY(SYSDATE)
-----------------
2011-6-30 0:17:57
如:各月倒数第3天入职的员工信息;
select * from emp where hiredate=last_day(hiredate)-2;
4.转换函数
虽然oracle中有自动转化功能,但有时候有的还是需要进行转化;
这里我说下to_char();该函数功能很广泛,可用于日期也可以用于薪水;
insert into emp values(100,'邓言诚','MANAGER',7566,sysdate,3232,324,10);
然后查询:SQL> select ename,to_char(hiredate,'yyyy-MM-dd HH24:mi:ss') "入职时间",to_char(sal,'L99,999.99') "薪资" from emp where empno=100;
ENAME 入职时间 薪资
---------- ------------------- --------------------
邓言诚 2011-06-19 00:44:01 ¥3,232.00
这里注意下:当使用别名时,使用中文要使用“”括起来,''不行。
就查询语句中的日期格式我就不说了,我来说下薪资的格式
L ---》表示当地的货币类型;
99,999.99---》小数点前表示整数,小数点后表示小数。至于前面的<,> 大家取钱都见过这种格式吧!还有就是数据要根据你创建表示的格式而定,如该emp表:sal number(7,2);
如果要使用国际货币则使用“$”....(把L换成相应的国际货币符号就可以了)
5.系统函数
a.terminal:当前会话客户所对应的终端的标示符
b.language :语言
c.db_name:当前数据库名称
d.nls_date_format;当前会话客户对应的日期格式
e.session_user:会话客户所对应的数据库用户名
f.current_schema:当前会话客户对应的默认方案名?
g.host:返回数据库所在主句名称
select sys_context('userenv','db_name') from dual;这里的userenv是用户所处环境
数据库管理员:
1.管理数据库的用户主要是sys 和system,他们的主要区别是:
(1)最重要的区别:存储的数据的重要性不同。
sys:所有oracle的数据字典的基表和视图都存放在sys用户中,这些基表和视图对于oracle的运行至关重要。由数据库自己维护,任何用户都不能手动更改。sys用户拥有dba,sysdba,sysoper角色或权限,是oracle权限最高的用户。
system:用于存放次级的内部数据;如oracle的一些特性或工具管理信息。system用户拥有dba,sysdab角色或系统权限。
(2)其次区别:权限不同。
sys用户必须以as sysdba 或as syspoer形式登陆,不能以normal方式登陆数据库
system如果正常登陆。它其实就是一个普通的dba用户,但是如果以as sysdba登陆,其结果实际上它是作为sys用户登录的。(见附图)
2.数据库的逻辑备份(到出)和恢复(导入)【注意在导入和导出要在oracle安装目录的BIN 下进行】
导出表:
a.导出自己的表:(见附图)
E:\oracle\product\10.1.0\Db_1\BIN>exp userid=scott/woai5jia@ORCL tables=(emp) fi
le=d:\emp1.dmp
b.导出其他方案的表:在这个提下方案,一个用户的创建就会生成对应一个和用户名相同的方案;
E:\oracle\product\10.1.0\Db_1\BIN>exp userid=system/pass@ORCL tables=(scott.emp) fi
le=d:\emp2.dmp
c.导出表结构
E:\oracle\product\10.1.0\Db_1\BIN>exp userid=scott/woai5jia@ORCL tables=(emp) fi
le=d:\emp3.dmp rows=n
d.直接导出方式,这种方式导入速度快,当数据量很大的时候可以考虑使用该方式
E:\oracle\product\10.1.0\Db_1\BIN>exp userid=scott/woai5jia@ORCL tables=(emp) fi
le=d:\emp4.dmp direct=y
导出方案:
a.导出自己方案
exp userid=scott/woai5jia@ORCL owner=scott file=d:\emp5.dmp
b.导出其他方案
exp userid=system/pass@ORCL owner=(system,scott) file=d:\emp6.dmp[这里表示用system用户导出自己的方案并导出scott方案]
导出数据库:【要求该用户具有dba权限或是exp_full_datebase权限】
exp userid=scott/woai5jia@ORCL full=y inctype=complete file=d:\emp7.dmp(inctype 表示增量备份)
导入表 和上面的对应
a.导入自己的表
imp userid=scott/woai5jia@ORCL tables=(emp) file=d:\emp.dmp;
b.导入表到其他用户
imp userid=system/pass@ORCL tables=(emp) file=d:\xx.dmp touser=scott;
c.导入表结构,只导入结构不导入数据
imp userid=scott/woai5jia@ORCL tables=(emp) file=d:\emp1.dmp rows=n;
d.导入数据:如果对象(如表)已经存在,则只导入数据
imp userid=scott/woai5jia@ORCL tables=(emp) file=d:\xxx.dmp ignore=y;
导入方案:
a.导入自身方案
imp userid=scott/woai5jia@ORCL file=d:\emp4.dmp;
b.导入其他方案【还是需要拥有dba身份】
imp userid=system/pass@ORCL file=d:\emp4.dmp fromuser=system touser=scott;
导入数据库
imp userid=system/pass full=y file=d:\xxxx.dmp;
--------------------------------------------------------------------------
* 注意以上的导入导出要对应相应的.dmp 我在这里只是把功能列出来,没有具体对应。应为我当时建的时候
没有标记dmp所对应的表
------------------------------------------------------------------------
前面介绍了当创建一个用户就会生成一个与之名称相对应得方案,其中方案中就包含下面的数据字典和动态性能视图。。。。。
数据字典 和动态性能视图
数据字典:在oracle中提供了数据库的一些系统信息,是静态的数据
动态性能视图: 记载了例程启动后的相关信息,是动态数据
数据字典视图:
(1)user_tables;用于显示当前用户所拥有的所有表,它只返回所对应方案的所有表
select table_name from user_tables;
(2)all_tables :用于显示当前用户可以访问的所有表,不仅返回当前用户方案表,还可以返回当前用户可以访问的其他方案表 select table_name from all_tables;
(3) dba_tables 它显示所有方案所有的数据库表,但是查询这种数据库字典
视图。要求用户必须是dba角色或是select any table 系统权限
SQL> conn system/pass;
Connected to Oracle Database 10g Enterprise Edition Release 10.1.0.2.0
Connected as system
SQL> select table_name from dba_tables;
重要查询:
//通过dba_users可以显示所有数据库用户的消息信息
select username,password from dba_users;
//通过查询数据字典视图dba_sys_privs,可以显示用户所具有的系统权限
SQL> desc dba_role_privs;
Name Type Nullable Default Comments
------------ ------------ -------- ------- -------------------------------------------------
GRANTEE VARCHAR2(30) Y Grantee Name, User or Role receiving the grant
GRANTED_ROLE VARCHAR2(30) Granted role name
ADMIN_OPTION VARCHAR2(3) Y Grant was with the ADMIN option
DEFAULT_ROLE VARCHAR2(3) Y Role is designated as a DEFAULT ROLE for the user
SQL> select * from dba_role_privs where GRANTEE='SCOTT';
GRANTEE GRANTED_ROLE ADMIN_OPTION DEFAULT_ROLE
------------------------------ ------------------------------ ------------ ------------
SCOTT CONNECT NO YES
SCOTT RESOURCE NO YES
//通过查询数据库字典dba_role_privs 可以显示用户所具有的角色
select * from dba_role_privs;
//如何查询一个角色包括的权限?
a.一个角色包含系统权限
select * from dba_sys_privs where grantee= 'CONNECT';
另外也可这样查看
SQL> conn system/pass as sysdba;
Connected to Oracle Database 10g Enterprise Edition Release 10.1.0.2.0
Connected as SYS
SQL> select * from role_sys_privs where role='CONNECT';
ROLE PRIVILEGE ADMIN_OPTION
------------------------------ ---------------------------------------- ------------
CONNECT CREATE VIEW NO
CONNECT CREATE TABLE NO
CONNECT ALTER SESSION NO
CONNECT CREATE CLUSTER NO
CONNECT CREATE SESSION NO
CONNECT CREATE SYNONYM NO
CONNECT CREATE SEQUENCE NO
CONNECT CREATE DATABASE LINK NO
b.一个角色包含党的对象权限
select * from dba_tab_privs where grantee='CONNECT';
//查询某个用户具有怎样的角色
select * from dba_role_privs where grantee='SCOTT';
//查询oracle中所有的系统权限。一般是dba
select * from system_privilege_map order by name;
//查询oracle中所有的角色,一般是dba
select * from dba_roles;
//查询oracle中所有对象权限,一般是dba
select distinct privilege from dba_tab_privs;
//查询数据库的表空间
select tablespace_name from dba_tablespaces;
//查看当前数据库
SQL> select * from global_name;
GLOBAL_NAME
--------------------------------------------------------------------------------
ORCL
下面总结下:一个用户拥有多个角色,一个角色是多个权限的集合;
管理表空间和数据文件*****
表空间是数据库的逻辑组成部分,从物理上讲,数据库数据(如表等)存放在数据文件中,从逻辑上讲,数据库则是存放在表空间中,表空间由一个或多个数据文件组成(见附图),所以我们通过操作表空间来操作表文件!
表空间:表空间用于逻辑上组织数据库的数据,数据库逻辑上是有一个或是多个表空间组成。通过表空间可以达到以下作用a.控制数据库占用的磁盘空间b.dba 可以将不同数据类型部署到不同的位置,这样有利于提高I/O性能,同时利于备份和恢复等管理操作。
- 附件.rar (1.2 MB)
- 下载次数: 3
发表评论
-
oracle 笔记下
2011-07-06 18:17 802建立表空间:建立表空 ... -
jquery 对select中的option操作
2011-06-15 16:28 6276Jquery的功能很强大,下面 ... -
MySQL实现分页技术
2011-06-09 08:29 917先给出servlet package com.ourchr.s ... -
servlet cookie jsp
2011-05-19 18:21 926首先是登陆界面,其中有mes_zh等国际化 这个不重要 < ... -
java学习日记(线程)
2011-05-18 18:38 827java学习日记(线程) 一 ... -
Java Servlet和JSP 处理Cookie
2011-05-18 13:28 19669.1 Cookie概述 Cookie是服务器发送给浏 ... -
简单的qq实现
2011-05-17 18:42 768很好用 简洁 -
简单的日历控件
2011-05-17 18:40 818package Exception; import java ... -
完整的JDBC 简单列子
2011-05-17 18:38 699package dao; import java.sql.Co ... -
jsp jstl 标签3
2011-05-13 17:38 717<c:import> 作用:导入一个url的资源, ... -
jsp jstl 标签2
2011-05-13 17:38 752c:forEach 用于循环的<c:forEach&g ... -
jsp jstl 标签1
2011-05-13 17:36 1205一、引入包: jstl.jar (1 ... -
js 中this用发小结
2011-03-09 09:19 713js中this的总结 在面向对 ... -
js 正则表达式
2011-02-24 15:12 638js正则表达式 exec 方法 用正则表达式模式在字符串中运 ... -
WEB innerHTML中div 和span
2011-02-24 13:58 1271使用innerHTML属性来控制DIV和SPAN<$lo ... -
Myeclipse 快捷键打总结
2011-01-08 13:01 747xml、jsp、jsf、js等等,我们没有必要全部都去自动校验 ... -
java基础知识
2011-01-07 17:35 738 -
java文件夹之间的复制
2011-01-06 14:58 668package Exception; import java. ...
相关推荐
内容概要:本文详细介绍了永磁同步电机(PMSM)三闭环控制系统的仿真建模方法及其参数优化技巧。首先阐述了三闭环控制的整体架构,即位置环、速度环和电流环的层级关系,并解释了每个环节的作用。接着展示了各环的具体实现代码,如电流环的PI控制器、速度环的前馈控制以及位置环的限幅处理。文中强调了调参的重要性和注意事项,提供了具体的参数选择依据和调试建议。最后分享了一些实用的仿真技巧,如死区补偿、故障注入等,确保模型能够应对实际工况。 适合人群:从事电机控制研究的技术人员、研究生及以上水平的学生,特别是对永磁同步电机三闭环控制感兴趣的读者。 使用场景及目标:适用于需要深入了解PMSM三闭环控制原理并进行仿真实验的研究人员和技术开发者。目标是帮助读者掌握如何构建高效的三闭环控制系统,提高电机性能,降低能耗,增强系统的鲁棒性和可靠性。 其他说明:文中提供的代码片段和参数配置均基于MATLAB/Simulink平台,建议读者在实践中结合实际情况调整参数,以获得最佳效果。同时,附带的参考资料也为进一步学习提供了指导。
光电材料仿真,电子仿真等;从入门到精通教程;含代码案例解析。
内容概要:本文详细介绍了利用PFC3D5.0进行滑坡致灾与建筑物易损性分析的完整代码实现。首先,通过Python和Fish语言构建了滑坡体和建筑物的模型,设置了关键参数如密度、刚度、摩擦系数等,确保滑坡体能够真实模拟滑坡行为。其次,针对建筑物的不同部位(楼板、墙体、支柱),采用不同的材料特性进行建模,并加入了实时监测系统,用于记录滑坡过程中各部件的应力、应变以及冲击力的变化情况。此外,还实现了冲击力监测、损伤评估等功能,能够自动触发应急分析并在模拟结束后生成详细的损伤报告。最后,通过对多次模拟结果的数据处理,生成了建筑物的易损性曲线,验证了模型的有效性和准确性。 适合人群:从事地质灾害研究、土木工程、结构安全评估的研究人员和技术人员。 使用场景及目标:适用于滑坡灾害预测、建筑设计优化、抗震防灾等领域。通过模拟不同条件下滑坡对建筑物的影响,帮助研究人员更好地理解滑坡致灾机理,为制定有效的防护措施提供科学依据。 其他说明:文中提供了大量实用的小技巧,如调整参数以获得更好的模拟效果、优化计算效率等。同时强调了模型验证的重要性,确保研究成果具有较高的可信度。
编译httpserver 通过后记录的
光电材料仿真,电子仿真等;从入门到精通教程;含代码案例解析。
内容概要:本文详细探讨了在Android平台上进行图像模板匹配的技术挑战和解决方案,特别是在处理不同尺寸和旋转角度的目标物时的方法。文中介绍了使用OpenCV构建图像金字塔、处理旋转模板以及利用NEON指令集优化性能的具体实现。此外,文章还讨论了在armeabi-v7a和arm64-v8a这两种主要ARM架构下的优化技巧,如内存对齐、SIMD指令优化、RenderScript并行处理等。作者分享了许多实践经验,包括如何避免常见的性能瓶颈和兼容性问题。 适合人群:有一定Android开发经验,尤其是熟悉OpenCV和NDK编程的中级及以上开发者。 使用场景及目标:适用于需要在移动设备上进行高效图像识别的应用开发,如实时视频流中的物体检测、游戏内的道具识别等。目标是提高模板匹配的速度和准确性,同时确保在不同硬件配置下的稳定性和兼容性。 其他说明:文章提供了丰富的代码片段和实际案例,帮助读者更好地理解和应用所介绍的技术。特别强调了在不同ARM架构下的优化策略,为开发者提供了宝贵的参考资料。
光电材料仿真,电子仿真等;从入门到精通教程;含代码案例解析。
内容概要:本文详细介绍了利用COMSOL软件模拟电晕放电离子风的过程。首先解释了电晕放电的基本概念,即在高压电场下电极周围空气被电离形成离子风。接着阐述了如何在COMSOL中建立针-板电极结构的三维模型,涉及静电、层流和稀物质传递三个物理场的设置。文中提供了具体的MATLAB代码片段用于初始化模型、定义几何体、设置边界条件、配置物理参数、进行网格划分以及求解模型。此外,还讨论了求解过程中可能出现的问题及解决方法,如收敛技巧、网格划分策略等。最后强调了通过模拟获得的电场分布、气流速度和离子浓度等结果对于理解和优化电晕放电离子风设备的重要性。 适用人群:对电晕放电现象感兴趣的科研人员和技术开发者,尤其是那些希望深入了解多物理场耦合仿真技术的人群。 使用场景及目标:适用于需要研究电晕放电离子风特性的场合,如空气净化装置、散热设备等领域的产品设计与性能评估。目标是帮助用户掌握如何使用COMSOL软件构建并求解电晕放电离子风模型,从而更好地理解相关物理机制。 其他说明:文中提到的实际操作细节和遇到的技术挑战有助于新手避免常见错误,提高建模效率。同时,提供的具体参数设置和代码示例也为进一步深入研究奠定了基础。
内容概要:本文详细介绍了多模态属性级情感分析的技术原理及其应用场景。首先解释了多模态属性级情感分析的意义,即通过结合文本和图像信息来更全面地理解用户情感。接着阐述了数据预处理方法,如使用BERT进行文本编码和ResNet处理图像。然后深入探讨了模型架构,包括双流网络结构和特征融合策略,以及如何通过跨模态注意力机制实现更好的特征对齐。此外,文中还分享了多个实战案例,如电商广告投放系统中如何利用该技术提高转化率,以及在处理用户评价时遇到的问题和解决办法。最后讨论了一些常见的技术挑战,如模态间权重调整、背景干扰物处理等。 适合人群:从事自然语言处理、计算机视觉研究的专业人士,尤其是希望将这两种技术结合起来进行情感分析的研究者和技术开发者。 使用场景及目标:适用于电商平台、社交媒体平台等需要分析用户反馈的场景,旨在帮助企业更好地理解消费者的真实想法,从而优化产品和服务。通过这种方式,企业可以发现潜在的市场机会并改进营销策略。 其他说明:文章不仅提供了理论指导,还包括具体的代码实现示例,有助于读者快速上手实践。同时强调了实际应用中的注意事项,如数据清洗、模型调优等方面的经验教训。
内容概要:本文详细介绍了5MW海上永磁风电直驱系统的Simulink仿真过程,涵盖矢量控制、混合储能系统以及并网逆变器的设计与调试。首先,文章解释了系统架构,包括永磁电机、两电平并网变流器和混合储能模块。接着,深入探讨了矢量控制中的坐标变换、PI参数设置及其对电网波动的影响。对于混合储能系统,文章讨论了滑动平均滤波用于功率分配的方法,确保超级电容和锂电池的有效协同工作。此外,文章还涉及并网逆变器的控制策略,特别是变参数PI控制和死区时间补偿,以应对复杂的电网环境。最后,通过仿真结果展示了系统的高效性和稳定性。 适合人群:从事电力电子工程、风电系统设计与仿真的工程师和技术研究人员。 使用场景及目标:适用于希望深入了解海上风电系统仿真技术的专业人士,旨在提高对矢量控制、混合储能和并网逆变器的理解,从而优化实际应用中的系统性能。 其他说明:文中提供了多个MATLAB代码片段,帮助读者更好地理解和复现相关控制算法。同时,强调了仿真过程中遇到的实际问题及解决方案,如风速突变、电网电压跌落等情况下的系统响应。
光电材料仿真,电子仿真等;从入门到精通教程;含代码案例解析。
该资源为natsort-5.4.0-py2.py3-none-any.whl,欢迎下载使用哦!
内容概要:本文详细介绍了双馈风力发电机(DFIG)的矢量控制仿真模型,特别是定子侧和转子侧的控制策略。定子侧采用电压定向矢量控制,通过双闭环结构(外环控制直流侧电压,内环控制电流),确保功率因数为1。转子侧采用磁链定向矢量控制,同样基于双闭环结构(外环控制功率,内环控制电流),并引入前馈电压补偿提高响应速度。文中提供了具体的PI控制器代码实现,并讨论了仿真模型的搭建方法,如使用Python的scipy库进行动态响应模拟。此外,文章还提到了一些常见的仿真问题及解决方案,如crowbar保护电路、最大功率跟踪算法和低电压穿越模块等。 适合人群:从事风电系统设计、控制算法开发的研究人员和技术人员,以及对电力电子控制系统感兴趣的工程师。 使用场景及目标:适用于希望深入了解DFIG矢量控制原理和实现细节的专业人士,帮助他们掌握定子侧和转子侧的具体控制策略,优化仿真模型,解决实际工程中的问题。 其他说明:文章不仅提供了理论分析,还包括了大量的代码片段和实践经验,有助于读者更好地理解和应用相关技术。
内容概要:本文详细介绍了利用Python进行煤矿瓦斯气驱过程中二氧化碳和氮气的应用方法和技术细节。首先展示了如何通过Python脚本处理气驱压力监测数据并绘制对比图,接着讲解了注气速率控制的PID算法实现及其注意事项。文中还涉及裂隙气体扩散模拟、湿度对氮气驱替的影响以及基于状态机的注气控制系统设计。此外,提供了实时气体浓度监控、数据滤波、阈值报警等功能的具体实现方式,并强调了数据可视化的应用价值。最后讨论了注气孔布置优化和注气压力控制的实际操作要点。 适合人群:从事煤矿开采及相关领域的技术人员、工程师,尤其是具有一定编程基础并对自动化控制感兴趣的从业者。 使用场景及目标:适用于煤矿瓦斯气驱项目的规划、实施与维护阶段,旨在提高瓦斯抽采效率,确保安全生产,同时减少人为因素导致的操作失误。通过学习本文提供的代码示例和技术方案,读者能够掌握如何运用Python解决实际工程问题的方法。 其他说明:文中提到的所有代码均为简化版本,用于解释相关概念和技术原理,在实际项目中可能需要进一步完善和优化。对于希望深入了解该领域的读者而言,本文不仅提供了实用的技术指导,也为后续研究奠定了良好的基础。
光电材料仿真,电子仿真等;从入门到精通教程;含代码案例解析。
街道级行政区划边界,wgs84坐标系,shp数据,直接分析使用。
字节码.md
Maven.md
内容概要:本文详细介绍了如何使用带有外源输入的非线性自回归网络(NARX)进行多变量时间序列预测,并提供了完整的Matlab代码实现。文章首先解释了NARX的基本概念,强调其能够同时考虑时间序列自身的历史值和其他相关变量(如政策变量)。接着逐步展示了从数据准备、创建NARX网络、训练网络到最后的预测与评估的具体步骤。文中还讨论了一些常见的挑战,如数据预处理、参数选择和模型优化技巧。此外,通过具体的例子演示了NARX在网络结构配置、训练方法选择等方面的应用细节。 适合人群:对时间序列预测感兴趣的研究人员和技术开发者,尤其是有一定Matlab基础并希望通过实例加深对NARX网络理解的人群。 使用场景及目标:适用于需要处理多变量时间序列预测任务的实际工程项目,如经济预测、电力系统负荷预测、空气质量预测等领域。目的是帮助读者掌握NARX网络的工作原理及其在不同应用场景下的具体实现方法。 其他说明:文章不仅提供理论指导,还包括大量实用的操作指南和代码片段,有助于读者快速上手实践。同时指出NARX虽然有效但对于长期依赖问题不如LSTM,但在特定条件下仍然是工业界的优选方案。
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。