使用 profile 管理用户口令
概述:profile 是口令限制,资源限制的命令集合,当建立数据库的,oracle会自动建立名称为 default 的 profile 。当建立用户没有指定 profile 选项,那么 oracle 就会将 default 分配给用户。
1.账户锁定
概述:指定该用户登陆时最多可以输入密码的次数,也可以指定用户锁定的时间,一般用 dba 的身份去执行该命令。
例子:指定 scott 这个用户最多只能尝试 3 次登陆,锁定时间为 1 天,看下是怎么实现的。
创建 profile 文件
SQL> create profile lock_account limit failed_login_attempts 3 password_lock_time 1;
SQL> alter user scott profile lock_account;
2.给用户解锁
SQL> alter user tea account unlock;
3.终止口令
为了让用户定期修改密码,可以使用终止口令的指令来完成,这个命令也需要 dba 的身份来操作。
例子:给前面创建的用户 bobi 创建一个 profile 文件,要求该用户每隔 15 天要修改自己的登陆密码,宽限期为 3 天。看下怎么实现。
SQL> create profile myprofile limit password_life_time 15 password_grace_time 3;
SQL> alter user bobi 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)分配给某个用户
SQL> alter user bobi profile password_history ;
删除 profile
概述:当不需要某个profile文件时,可以删除该文件。
SQL> drop profile password_history 【casade】
注意:文件删除后,用这个文件约束的所有用户都被释放了。
加了casade,会把级联的相关东西也都给删除掉。
Oracle 表的管理
表名和列的命名规则
-
必须以字母开头
-
长度不能超过 30 个字符
-
不能使用 oracle 的保留字
-
只能使用字符:A-Z,a-z,0-9,$ , # 等。
oracle 支持的数据类型
char 定长 最大2000个字符。
例子:char(10) ‘Stephen’前面 7 个字符放‘Stephen’,后面补 3 个空格,’Stephen ‘。
varchar2(20) 变长 最大4000个字符。
例子:varchar2(10) ‘Stephen’ oracle 分配 7 个字符,节省空间。
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', 'Stephen', '男', '19-5月-88', 5000);
oracle 中默认的日期格式‘dd-mon-yy’
dd 日(天)
mon 月
yy 2位的年
'18-4月-19' 2019年4月18日
修改日期的默认格式(临时修改,数据库重启后仍为默认;如要修改需要修改注册表)
ALTER SESSION SET NLS_DATE_FORMAT ='yyyy-mm-dd';
修改后,可以用我们熟悉的格式添加日期类型:
INSERT INTO student VALUES ('A002', 'Bobi', '男', '1985-05-06', 8000);
插入部分字段
INSERT INTO student(xh, xm, sex) VALUES ('A003', 'Lucy, '女');
插入空值
INSERT INTO student(xh, xm, sex, birthday) VALUES ('A004', 'Lily', '女', null);
问题:如果要查询 student 表里 birthday 为 null 的记录怎么写 sql ?
错误写法:select * from student where birthday = null;
正确写法:select * from student where birthday is null;
如果要查询 birthday 不为 null ,则应该这样写:
select * from student where birthday is not null;
修改数据
修改一个字段
UPDATE student SET sex = '女' WHERE xh = 'A001';
修改多个字段
UPDATE student SET sex = '男', birthday = '1991-01-01' WHERE xh = 'A001';
查询含有 null 值的数据
不用 = null 而用 is null;
SELECT * FROM student WHERE birthday IS null;
删除数据
DELETE FROM student;
删除所有记录,表结构还在,写日志,可以恢复的,速度慢。
Delete 的数据可以恢复。
savepoint a; --创建保存点
DELETE FROM student;
rollback to a; --恢复到保存点
一个有经验的DBA,在确保完成无误的情况下要定期创建还原点。
删除表的结构和数据
DROP TABLE student;
删除一条记录
delete from student WHERE xh = 'A001';
删除表中的所有记录,表结构还在,不写日志,无法找回删除的记录,速度快:
truncate TABLE student;
今天笔记做到这,后续有空继续。