除了自己不能给自己授权外,sys,system 和所要操作的用户均可以给其他的用户授权 现在说下对象权限,现在要做这么件事情: * 希望xiaoming用户可以去查询emp表
* 希望xiaoming用户可以去查询scott的emp表 grant select on emp to xiaoming
* 希望xiaoming用户可以去修改scott的emp表 grant update on emp to xiaoming
* 希望xiaoming用户可以去修改/删除,查询,添加scott的emp表 grant all on emp to xiaoming
* scott希望收回xiaoming对emp表的查询权限 revoke select on emp from xiaoming
---------------------------------------------玩转oracle第五讲-------------------------------------------------- //对权限的维护。
* 希望xiaoming用户可以去查询scott的emp表/还希望xiaoming可以把这个权限继续给别人。
--如果是对象 权限,就加入 with grant option grant select on emp to xiaoming with grant option 我的操作过程:
SQL> conn scott/tiger; 已连接。
SQL> grant select on scott.emp to xiaoming with grant option; 授权成功。
SQL> conn system/p; 已连接。
SQL> create user xiaohong identified by m123; 用户已创建。
SQL> grant connect to xiaohong; 授权成功。
SQL> conn xiaoming/m12; 已连接。
SQL> grant select on scott.emp to xiaohong; 授权成功。
--如果是系统权限。
system给xiaoming权限时:
grant connect to xiaoming with admin option
问题:如果scott把xiaoming对emp表的查询权限回收,那么xiaohong会怎样? 答案:被回收。
下面是我的操作过程: SQL> conn scott/tiger; 已连接。
SQL> revoke select on emp from xiaoming; 撤销成功。
SQL> conn xiaohong/m123; 已连接。
SQL> select * from scott.emp; select * from scott.emp 第 1 行出现错误:
ORA-00942: 表或视图不存在
结果显示:小红受到诛连了。
使用profile管理用户口令
概述:profile是口令限制,资源限制的命令集合,当建立数据库的,oracle会自动建立名称为default的profile。当建立用户没有指定profile选项,那么oracle就会将default分配给用户。
1.账户锁定
概述:指定该账户(用户)登陆时最多可以输入密码的次数,也可以指定用户锁定的时间(天)一般用dba的身份去执行该命令。
例子:指定scott这个用户最多只能尝试3次登陆,锁定时间为2天,让我们看看怎么实现。 创建profile文件
SQL> create profile lock_account limit failed_login_attempts 3 password_lock_time 2; SQL> alter user scott profile lock_account;
2.给账户(用户)解锁
SQL> alter user tea account unlock;
3.终止口令
为了让用户定期修改密码可以使用终止口令的指令来完成,同样这个命令也需要dba的身份来操作。
例子:给前面创建的用户tea创建一个profile文件,要求该用户每隔10天要修改自己的登陆密码,宽限期为2天。看看怎么做。
SQL> create profile myprofile limit password_life_time 10 password_grace_time 2; SQL> alter user tea profile myprofile;
口令历史
概述:如果希望用户在修改密码时,不能使用以前使用过的密码,可使用口令历史,这样oracle就会将口令修改的信息存放到数据字典中,这样当用户修改密码时,oracle就会对新旧密码进行比较,当发现新旧密码一样时,就提示用户重新输入密码。 例子:
1)建立profile
SQL>create profile password_history limit password_life_time 10 password_grace_time 2 password_reuse_time 10
password_reuse_time //指定口令可重用时间即10天后就可以重用 2)分配给某个用户
删除profile
概述:当不需要某个profile文件时,可以删除该文件。 SQL> drop profile password_history 【cascade】
注意:文件删除后,用这个文件去约束的那些用户通通也都被释放了。 加了cascade,就会把级联的相关东西也给删除
---------------------------------------------------------------------------------------------------------------------- -------------------------------------------- 第二天 --------------------------------------------------
四:oracle表的管理(数据类型,表创建删除,数据CRUD操作)
oracle的表的管理 (创建和维护) 表名和列的命名规则
必须以字母开头
? 长度不能超过30个字符 ? 不能使用oracle的保留字
? 只能使用如下字符 A-Z,a-z,0-9,$,#等
?
oracle支持的数据类型
字符类
char 定长 最大2000个字符。
例子:char(10) ?小韩?前四个字符放?小韩?,后添6个空格补全 如?小韩?
varchar2(20) 变长 最大4000个字符。
例子:varchar2(10) ?小韩? oracle分配四个字符。这样可以节省空间。 clob(character large object) 字符型大对象 最大4G
char 查询的速度极快浪费空间,查询比较多的数据用。
varchar 节省空间
数字型
number范围 -10的38次方 到 10的38次方 可以表示整数,也可以表示小数 number(5,2)
表示一位小数有5位有效数,2位小数 范围:-999.99到999.99 number(5)
表示一个5位整数 范围99999到-99999
日期类型
date 包含年月日和时分秒 oracle默认格式 1-1月-1999
timestamp 这是oracle9i对date数据类型的扩展。可以精确到毫秒。 图片
blob 二进制数据 可以存放图片/声音 4G 一般来讲,在真实项目中是不会把图片和声音真的往数据库里存放,一般存放图片、视频的路径,如果安全需要比较高的话,则放入数据库。
怎样创建表 建表
--学生表
create table student ( ---表名
xh number(4), --学号 xm varchar2(20), --姓名
sex char(2), --性别
birthday date, --出生日期 sal number(7,2) --奖学金 );
--班级表
CREATE TABLE class( classId NUMBER(2), cName VARCHAR2(40) );
修改表
添加一个字段
SQL>ALTER TABLE student add (classId NUMBER(2)); 修改一个字段的长度
SQL>ALTER TABLE student MODIFY (xm VARCHAR2(30)); 修改字段的类型/或是名字(不能有数据) 不建议做 SQL>ALTER TABLE student modify (xm CHAR(30));
删除一个字段 不建议做(删了之后,顺序就变了。加就没问题,应为是加在后面)
SQL>ALTER TABLE student DROP COLUMN sal; 修改表的名字 很少有这种需求 SQL>RENAME student TO stu; 删除表
SQL>DROP TABLE student;
添加数据
所有字段都插入数据
INSERT INTO student VALUES ('A001', '张三', '男', '01-5月-05', 10); oracle中默认的日期格式‘dd-mon-yy’ dd日子(天) mon 月份 yy 2位的年 ‘09-6月-99’ 1999年6月9日
修改日期的默认格式(临时修改,数据库重启后仍为默认;如要修改需要修改注册表)
ALTER SESSION SET NLS_DATE_FORMAT ='yyyy-mm-dd'; 修改后,可以用我们熟悉的格式添加日期类型:
INSERT INTO student VALUES ('A002', 'MIKE', '男', '1905-05-06', 10); 插入部分字段
INSERT INTO student(xh, xm, sex) VALUES ('A003', 'JOHN', '女'); 插入空值
INSERT INTO student(xh, xm, sex, birthday) VALUES ('A004', 'MARTIN', '男', null);
问题来了,如果你要查询student表里birthday为null的记录,怎么写sql呢?
错误写法:select * from student where birthday = null; 正确写法:select * from student where birthday is null; 如果要查询birthday不为null,则应该这样写: