oracle:数据库对象:创建用户和赋予权限,数据表,序列,事务,约束

时间:2021-11-06 08:46:14
/*视图
视图(view),称为虚表,在数据库中不存在实体。
视图本质上是对物理表(基表)的一种数据保护。让开发者或者用户只能看到基表中的部分数据。
*/
--------创建视图
--创建视图的语法:create or replace view 视图名 as query
-- 常见一个视图,查看雇员表的基本信息
create or replace view V_emp as 
select e.* from emp e
with read only;--只读视图

--------------- 删除视图
drop view v_emp

------- 使用视图(可以向使用表一样使用视图,但本质不是表,只是上面这段代码)
select * from v_emp

-----修改视图中的数据
-----添加数据
insert into v_emp (empno,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO)
values(1111,'viem','sggegwe',4444,sysdate,5555,22,20);
/*注意:
通过视图添加数据,数据最终添加到基本中,因为视图是虚表。
视图一般只是基表的部分数据,通过视图向基表添加数据时,基本的数据只能添加一部分,
此时如果基表会对未提供的字段置null。
如果基本对未提供的字段要求不能为null,此次添加会失败。*/

------------更新数据
update v_emp set comm=20
where empno=1111;
/*注意:不能通过视图更新视图不存在的字段
*/

------------------删除数据
delete from v_emp where empno=1111

-------------------视图的应用

-------平均薪水的等级最低的部门,它的部门名称是什么
select vt3.deptno,d.dname
from 
(select * 
from 
(select vt0.deptno,vt0.avgsal,sg.grade
      from (select e.deptno,avg(e.sal) "AVGSAL"
              from emp e
              group by e.deptno) VT0 join salgrade sg on vt0.avgsal between sg.losal and sg.hisal) VT2
where VT2.grade = 
(select min(vt1.grade)
from (select vt0.deptno,vt0.avgsal,sg.grade
      from (select e.deptno,avg(e.sal) "AVGSAL"
              from emp e
              group by e.deptno) VT0 join salgrade sg on vt0.avgsal between sg.losal and sg.hisal) VT1)) VT3 join dept d on vt3.deptno = d.deptno
              
              



-----------通过视图优化后
-----把重复的代码做出视图
create or replace view v$AvgSalGrade as
select vt0.deptno,vt0.avgsal,sg.grade
      from (select e.deptno,avg(e.sal) "AVGSAL"
              from emp e
              group by e.deptno) VT0 join salgrade sg on vt0.avgsal between sg.losal and sg.hisal
with read only


------------------再把视图拿出来
select vt3.deptno, d.dname
  from (select *
          from v$AvgSalGrade VT2
         where VT2.grade = (select min(vt1.grade) from v$AvgSalGrade VT1)) VT3
  join dept d
    on vt3.deptno = d.deptno


------------------------权限管理
--SQL四种语言:DDL,DML,DCL,TCL
---DDL(Data Definition Language)数据库定义语言statements are used to define the database structure or schema.
---DML(Data Manipulation Language)数据操纵语言statements are used for managing data within schema objects.
---DCL(Data Control Language)数据库控制语言  授权,角色控制等
---TCL(Transaction Control Language)事务控制语言


--第一个使用scott账户是需要解锁
alter user  scott  account  unlock;
--此时scott如果对数据库进行DDL操作是没有权限的。把创建视图、创建表的权限分配给soctt
--注意:权限性操作都要以sysdba什么来操作。
---- 使用system用户为scott增加权限:
grant create view,create table to scott;






/*
1.GRANT 赋于权限
常用的系统权限集合有以下三个:
CONNECT(基本的连接), RESOURCE(程序开发), DBA(数据库管理)

2.常用的数据对象权限有以下五个:
ALL ON 数据对象名, SELECT ON 数据对象名, UPDATE ON 数据对象名,DELETE ON 数据对象名, INSERT ON 数据对象名, ALTER ON 数据对象名GRANT CONNECT, RESOURCE TO 用户名;GRANT SELECT ON 表名 TO 用户名;GRANT SELECT, INSERT, DELETE ON表名 TO 用户名1, 用户名2;2.REVOKE 回收权限REVOKE CONNECT, RESOURCE FROM 用户名;REVOKE SELECT ON 表名 FROM 用户名;REVOKE SELECT, INSERT, DELETE ON 表名 FROM 用户名1, 用户名2;

3.删除用户
drop user 用户名 cascade

4、设置用户密码登录后失效,并要求修改密码
alter user 用户名 password expire;

5、账户锁定和解锁
alter user 用户名 account lock; (锁定)
alter user 用户名 account unlock;(解锁)


*/



----------------如何创建一个用户并授予一定权限?
--创建用户
create user test01 identified by 123
-- 查看是否创建成功
select *from dba_users
where username='TEST01'


-- 授权登录(会话)权限
grant create session to test01;

-- 默认用户没有任何表,而且不具备操作其他表的权限。
--select * from emp;
-- 授权soctt.emp所有权限(all)给test01
grant all on scott.emp totest01;

-- 回收权限

revoke all on scott.emp from test01;

-- 分配创建表的权限
grant create table to test01;


-- 此时test01用户可以select,但不能insert数据
grant unlimited tablespace to test01;



-- 修改用户密码
alter user test01 identified by 1234;

-- 级联删除用户
drop user test01 cascade;

--查看用户权限
select * from user_sys_privs;




----------------------------------------表
--数据库数据类型


--其他类型:
--CLOB:最大长度4G  -->大对象很少使用:如果存在大对象,一般的解决方案存入文件地址(地址为程序所在应用服务器的相对路径)。
--BLOB:存二进制文件
--注意:
--在数据库设计时,如果要存大文件(视频,音频等),一定不要用BLOB/CLOB,通用的解决方案都是文件的地址。

--------------------------表的创建
/*CREATE TABLE [schema.]table(
column datatype [DEFAULT expr] , …
);*/

-- 创建一个学生表
create table t_student (
sid number(4),
name varchar2(20),
phone char(11),
brithday date,
address varchar2(100)
) 
----------
select * from t_student
------------删除表
drop table t_student


---通过子查询结果创建表:
-- 通过其他表结构创建表
create table t_emp
as
select * from emp;
-- 只创建表的结构(复制表结构)
creat table t_emp
as
select * from emp where 1=2;


------------------表的修改
-- [1]给表添加字段
alter table t_student add grade number(2)


-- [2]删除表的字段
alter table t_student drop column grade;


-- [3] 修改表字段
alter table t_student modify(address varchar2(150))


-- [4]重命名
rename t_student to t_student1

----------
select * from t_student1


-----------------------------Insert/update/delete

------------insert (增加数据)(insert是事务操作,需要提交事务。)
--INSERT INTO    table [(column [, column...])] VALUES        (value [, value...]);
insert into t_student1(sid,name,phone,brithday,address)
values (1111,'dtydyyd',13345678987,sysdate,'fewfewfef')
--------如果是增加全部列数据可以:
insert into t_student1
values (1121,'dty1dyyd',13345678987,sysdate,'fewfgewfef')


--UPDATE    table SET    column = value [, column = value] … [WHERE    condition];
-------------update(更改数据)
update t_student1 
set address='86786',name='8783783'
where sid=1111


--DELETE [FROM]    table [WHERE    condition];
-------------delete(删除数据)
delete from t_student1 where sid=1111


--删除表中的所有数据-没有事务-速度快
truncate table t_student1;


---------------序列
--序列是oracle专有的对象,它用来产生一个自动递增的数列。
create sequence seq_empno
start with 1
increment by 1

-- 序列的使用
-- 序列中的下一个值,从定义(start with)的值开始
select seq_empno.nextval from dual;

-- 获取序列的当前值
select seq_empno.currval from dual;





-- 序列的应用
insert into  t_student1
values(seq_empno.nextval,'dty1dyyd',13345678987,sysdate,'fewfgewfef')



-- 删除序列
drop sequence seq_empno

---------在数据库开发设计表时,如果需要一个字段的值是自增的话,优先考虑序列。


---------------------事务
/*事务概念
事务(Transaction)是一个操作序列。这些操作要么都做,要么都不做,是一个不可分割的工作单位,是数据库环境中的逻辑工作单位。
事务是为了保证数据库的完整性。
事务不能嵌套

在oracle中,没有事务开始的语句。一个Transaction起始于一条DML(Insert、Update和Delete )语句,结束于以下的几种情况:
•用户显式执行Commit语句提交操作或Rollback语句回退。
•当执行DDL(Create、Alter、Drop)语句事务自动提交。
•用户正常断开连接时,Transaction自动提交。
•系统崩溃或断电时事务自动回退。
*/
select * from t_student1;
-- 事务以DML开始
-- beginTransaction(insert/update/delete)

insert into  t_student1
values(2222,'dty1dyyd',13345678987,sysdate,'fewfgewfef');
commit;-- 加入数据库,显示的事务结束(endTransaction)
--rollback;退回

--【2】隐式的事务结束(不需要commit; rollback;)
/*
create table abc(
   sid number
)
*/


/*事务结合java代码的格式
try{
insert …
…
insert …
commit
}catch(Exception e){
  rollback
}finlly{
  关闭数据库
}
*/




--------------------保存点(save point)


-- beginTrans
insert into  t_student1
values(2222,'dty1dyyd',13345678987,sysdate,'fewfgewfef');
insert into  t_student1
values(2222,'dty1dyyd',13345678987,sysdate,'fewfgewfef');

savepoint sp1;--保存点

insert into  t_student1
values(2222,'dty1dyyd',13345678987,sysdate,'fewfgewfef');
insert into  t_student1
values(2222,'dty1dyyd',13345678987,sysdate,'fewfgewfef');
rollback to sp1;--如果这一段有异常就退回保存点sp1
commit;

--save point 保持当前数据库的状态点。以便后续通过rollback回滚到指定状态点。

/*try{
insert …
insert …
save point sp1

insert …
insert …
save point sp2

commit
}catch(AException e){
  rollback
}catch(BException e){
  rollback to sp1
}
finlly{
  关闭数据库
}*/

--------------事务的特性
/*事务四大特征:原子性,一致性,隔离性和持久性。
1. 原子性(Atomicity)
    一个原子事务要么完整执行,要么干脆不执行。这意味着,工作单元中的每项任务都必须正确执行。如果有任一任务执行失败,则整个工作单元或事务就会被终止。即此前对数据所作的任何修改都将被撤销。如果所有任务都被成功执行,事务就会被提交,即对数据所作的修改将会是永久性的。
2. 一致性(Consistency)
    一致性代表了底层数据存储的完整性。它必须由事务系统和应用开发人员共同来保证。事务系统通过保证事务的原子性,隔离性和持久性来满足这一要求; 应用开发人员则需要保证数据库有适当的约束(主键,引用完整性等),并且工作单元中所实现的业务逻辑不会导致数据的不一致(即,数据预期所表达的现实业务情况不相一致)。例如,在一次转账过程中,从某一账户中扣除的金额必须与另一账户中存入的金额相等。支付宝账号100 你读到余额要取,有人向你转100 但是事物没提交(这时候你读到的余额应该是100,而不是200) 这种就是一致性
3. 隔离性(Isolation)
    隔离性意味着事务必须在不干扰其他进程或事务的前提下独立执行。换言之,在事务或工作单元执行完毕之前,其所访问的数据不能受系统其他部分的影响。
4. 持久性(Durability)
    持久性表示在某个事务的执行过程中,对数据所作的所有改动都必须在事务成功结束前保存至某种物理存储设备。这样可以保证,所作的修改在任何系统瘫痪时不至于丢失。
*/



---------------------------约束
/*
当我们创建表的时候,同时可以指定所插入数据的一些规则,比如说某个字段不能为空值,某个字段的值(比如年龄)不能小于零等等,这些规则称为约束。约束是在表上强制执行的数据校验规则.

常见约束:
1.NOT NULL    非空
2.UNIQUE Key    唯一键
3.PRIMARY KEY    主键
4.FOREIGN KEY    外键
5.CHECK        自定义检查约束
*/


----------------------主键约束(primary key)
--主键用于唯一标识一条记录。主键值不可为空,也不允许出现重复。


-- 创建表
-- 创建列级约束-显式指定名称,pk_sid
create table t_stydent(
sid number(4) constraint pk_sid primary key,
name varchar2(20)
)

-- 创建列级约束-没式显示指定名称,系统随机命名SYS_C..

create table t_stydent(
sid number(4)  primary key,
name varchar2(20)
)



----------------表级约束:当多个列(字段)参与约束,可以用表级约束。
--- 创建表,以表级约束
create table t_stydent(
sid number(4),
photo char(11),
constraint pk_sid primary key (photo,name)
)

create table t_stydent(
sid number(4),
photo char(11),
 primary key (photo,name)
)



-------------------非空约束(not null)确保字段值不允许为空,只能在列级定义

create table t_stydent(
sid number(4)  primary key,
name varchar2(20) constraint n_name1 not null

)

create table t_stydent(
sid number(4)  primary key,
name varchar2(20) not null

)

-- 添加操作
insert into t_student(sid)
values(1000)


------------------------唯一性约束(UNIQUE)

--唯一性约束条件确保所在的字段或者字段组合不出现重复值
--唯一性约束条件的字段允许出现空值

--Oracle将为唯一性约束条件创建对应的唯一性索引

create table t_stydent(
sid number(4)  primary key,
name varchar2(20) constraint up_name unique

)


create table t_stydent(
sid number(4),  
name varchar2(20),
 constraint up_name unique(sid,name)

)





---------------------自定义约束

--Check约束用于对一个属性的值加以限制



create table t_stydent(
sid number(4),  
name varchar2(20), 
  age number(3) check(age>0 and age<100)
)


----------------外键约束

create table t_stydent(
sid number(4),  
name varchar2(20), 
  age number(3), 
  tid number(4)
  constraint fk_tid foreign key(tid) references t_teacher(tid) on delete cascade
)



create table t_teacher(
tid number(4) primary key,
name vachar2(4) not null
)

insert into t_teacher
values(1,'alex');

insert into t_student
values(1000,'18612341234',15,1)

/*
对于主表的删除和修改主键值的操作,会对依赖关系产生影响,以删除为例:当要删除主表的某个记录(即删除一个主键值,那么对依赖的影响可采取下列3种做法:
1.RESTRICT方式:只有当依赖表中没有一个外键值与要删除的主表中主键值相对应时,才可执行删除操作。
2.CASCADE方式:将依赖表中所有外键值与主表中要删除的主键值相对应的记录一起删除
3.SET NULL方式:将依赖表中所有与主表中被删除的主键值相对应的外键值设为空值
FOREIGN KEY (DEPTNO) REFERENCES DEPT(DEPTNO)
[ON DELETE [CASCADE|SET NULL]] 如省略on短语,缺省为第一中处理方式。
*/