存储过程这东西还是相当关键的,说白了就是一堆 SQL 的合并,当然中间需要套用逻辑业务,类似于Java中的程序。

【优点】
  1.存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般 SQL 语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。
  
  2.当对数据库进行复杂操作时(如对多个表进行 Update,Insert,select,Delete 时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。
    这些操作,如果用程序来完成,就变成了一条条的 SQL 语句,可能要多次连接数据库。而换成存储过程,只需要连接一次数据库就可以了。
    
  3.存储过程可以重复使用,可减少数据库开发人员的工作量。
  
  4.安全性高,可设定只有某此用户才具有对指定存储过程的使用权。
  
  5.前端只需要传输值就可以,不用传输sql语句了.数据库自行调用储存过程,减少了网络的传输量
  
【缺点】

1.   运行速度:大多数高级的数据库系统都有cache的,所以编译sql的花费没什么影响。
                 但是执行存储过程要比直接执行sql花费更多(检查权限等),所以对于很简单的sql,存储过程没有什么优势。  
                    
  2.   网络负荷:如果在存储过程中没有复杂的业务,与库多次数据交互,那么实际上网络传输量和直接sql是一样的。
       
  3.   安全机制:对于传统的C/S结构,连接数据库的用户可以不同,所以安全机制有用;
                 但是在web的三层架构中,数据库用户不是给用户用的,所以基本上,只有一个用户,拥有所有权限(最多还有一个开发用户)。
                 这个时候,安全机制有点多余。   
                     
  4.   移植性:反正一般的应用总是绑定某个数据库的,不然就无法靠优化数据库访问来提高性能了。

——————————————————————————————————————————————————————

之后我们调用一下刚写的存储过程

SQL> set serveroutput on 【显示过程】

SQL> execute pro_zz('10002','10001',10000);
SQL> exec pro_zz('10001','10002',10000);

SQL> select * from account;(tom少10000,kate多10000)

接下来搭建看看升级版的。

——————————————————————————————————————————————————————

这里又加了一个表,这个表用来储存转账的总金额,当总金额超过一定限制之后就会提示转账失败,失败的话rollback回滚就可以了,成功则commit,这就是存储过程厉害的地方,省了很多时间,不用手动去弄了,当然这个看不懂也没关系,下面说说存储过程简单的语法,这里用最基础的两个数互换作为参考:

int temp;
int a=2;
int b=1;

temp=a;
a=b;
b=temp;

in out  是既需要传入参数,也用来传出值
create or replace procedure swap(p1 in out number,p2 in out number)
is
v_temp number;
begin
v_temp:=p1;
p1:=p2;
p2:=v_temp;
end;
/

调用带IN OUT参数的过程:

declare
num1 number:=100;
num2 number:=200;
begin
swap(num1,num2);
dbms_output.put_line('num1= '||num1);
dbms_output.put_line('num2= '||num2);
end;
/

其中num1,num2传入到p1,p2,
p1=100;
p2=200;
然后调用procedure后,p1=200,p1=100
这些值也同时输出

程序块定义语法:

declare
变量
begin
..
..
end;
/

create or replace procedure()
as
变量
begin
..
..
end;
/

根据这个我们来编写一个最最简单的存储过程,给它起个名字叫做proc_helloworld
CREATE OR REPLACE PROCEDURE proc_helloworld
IS
BEGIN
   DBMS_OUTPUT.put_line ('Hello World!');   
END;
/

之后运行。两种方法运行存储过程
1).需要在屏幕上显示出"DBMS_OUTPUT.put_line"的输出字符串,需要做一个小小的设置
sec@ora10g> show serveroutput
serveroutput OFF
sec@ora10g> set serveroutput on
sec@ora10g> show serveroutput
serveroutput ON SIZE 10000 FORMAT WORD_WRAPPED

2).在sqlplus命令行界面使用"EXECUTE"命令(简写做"EXEC")执行
sec@ora10g> exec proc_helloworld
Hello World!

PL/SQL procedure successfully completed.

3).在一个无名PL/SQL块内运行存储过程
BEGIN
   proc_helloworld;
END;
/

如果我们需要修改。那么修改一个存储过程只需要将修改好的存储过程在sqlplus界面先重新执行一下即可,因为在创建过程中使用的是"CREATE OR REPLACE PROCEDURE",也就是说如果没有就创建,如果已经存在了这个存储过程,就替换它
CREATE OR REPLACE PROCEDURE proc_helloworld
I4S
BEGIN
   DBMS_OUTPUT.put_line ('Hello World! '||chr(10)||'I am a Happy DBA Secooler!');
END;
/
或者
CREATE OR REPLACE PROCEDURE proc_helloworld
IS
BEGIN
   DBMS_OUTPUT.put_line ('Hello World! 
I am a Happy DBA Secooler!');
END;
/

再来看看如果报错了怎么处理

调试。对于非常复杂的存储过程的调试是真正体现个人魅力和能力的地方,往往需要很多的经验,这个急不得,只能慢慢来 Take it easy.
在sqlplus下调试存储过程时,如果出现错误,时刻使用"show errors"命令查看哪里出错了,例如:
sec@ora10g> CREATE OR REPLACE PROCEDURE proc_helloworld
  2  IS
  3  BEGIN
  4     DBMS_OUTPUT.put_line ('Hello World!');
  5  END
  6  /

Warning: Procedure created with compilation errors.

sec@ora10g> show errors
Errors for PROCEDURE PROC_HELLOWORLD:

LINE/COL ERROR
-------- -----------------------------------------------------------------
5/3      PLS-00103: Encountered the symbol "end-of-file" when expecting
         one of the following:
         ; <an identifier> <a double-quoted delimited-identifier>
         delete exists prior <a single-quoted SQL string>
         The symbol ";" was substituted for "end-of-file" to continue.

通过提示,问题出现在END后面没有分号结束符号,修改后问题得到处理
sec@ora10g> CREATE OR REPLACE PROCEDURE proc_helloworld
  2  IS
  3  BEGIN
  4     DBMS_OUTPUT.put_line ('Hello World!');
  5  END;
  6  /

Procedure created.

删除。使用drop语句删除存储过程,我们先查找删除的存储过程
sec@ora10g> select object_name,object_type,status from user_objects where OBJECT_TYPE='PROCEDURE';

OBJECT_NAME                    OBJECT_TYPE         STATUS
------------------------------ ------------------- -------
PROC_HELLOWORLD                PROCEDURE           VALID

sec@ora10g> DROP PROCEDURE proc_helloworld;

Procedure dropped.

sec@ora10g> select object_name,object_type,status from user_objects where OBJECT_TYPE='PROCEDURE';

no rows selected

接下来看看触发器:

一、 什么是触发器
数据库触发器是一个存储的PL/SQL程序块,它与一个基表联系,当在表上执行特定的数据库维护(插入、删除、更新这三种操作)时,隐含地执行一个PL/SQL程序块。

二、触发器的作用:
              。防止非法的数据库操纵、维护数据库安全
              。对数据库的操作进行审计,存储历史数据
              。完成数据库初始化处理
              。控制数据库的数据完整性
              。进行相关数据的修改
              。完成数据复制
              。自动完成数据库统计计算
              。限制数据库操作的时间、权限等,控制实体的安全性

三、触发器的组成:
             1、触发时间:触发器事件的时间次序(before, afer)[2]
             2、触发事件:什么SQL语句会引起触发器触发(Insert, delete, update)[3]
             3、触发子体:触发器触发时要执行的操作(一个完整的PL/SQL程序)
             4、触发类型:触发器被执行的次数(语句级、行级)[2] //语句级只执行一次,行级会执行多次。
                  [*]一个表上最多可以创建12个不同类型的触发器:3*2*2 = 12

四、创建触发器注意事项:
              1、在触发器中可以调用存储过程、包;在存储过程中不得调用触发器。
              2、在触发器中不得使用commit, rollback, savepoint语句。
              3、在触发器中不得间接调用含有commit, rollback, savepoint的语句的存储过程及函数。

五,创建触发器

实现当操纵员工表时自动将员工人数统计到部门表中。
1  scott用户下
create table dept1(dno int,dname varchar(20),population int);
create table emp1(eid int,ename varchar2(20),dno int);

insert into dept1 values (11,'sale',0);
insert into dept1 values (12,'market',0);
insert into dept1 values (13,'study',0);
commit;

2.
SQL> create or replace trigger autostatic
   after delete or insert or update on emp1
    for each row
    begin
    if inserting then                                 
    update dept1 set population=population+1     
     where dept1.dno=:new.dno;
    elsif deleting then
    update dept1 set population=population-1
  where dept1.dno=:old.dno;
   elsif updating then
   update dept1 set population=population+1
   where dept1.dno=:new.dno;
  update dept1 set population=population-1 
  where dept1.dno=:old.dno;
   end if;
   end;
/

**************************
员工表(员工编号,员工姓名,员工部门编号)

1    张三     10
2    张四     20
3    张五     30

insert into 员工表 values(4    张六     40);---->  :new

:new.员工编号=4      :new.员工部门编号=40

delete from 员工表 where 部门编号=30; ---------->删除了  张五

:old ---->删除的记录

:old.员工部门编号=30
:old.员工姓名=张五

张三 内部调岗---->  由 10号部门  跳到  20号部门

对于10号部门--->张三 用  :old 代表
对于20号部门--->张三 用  :new 代表
**************************

3.

SQL> select * from dept1;

DNO DNAME                POPULATION
---------- -------------------- ----------
        11 sale                          0
        12 market                        0
        13 study                         0

insert into emp1 values (1001,'prajna',11);
insert into emp1 values (1002,'sommer',12);
insert into emp1 values (1003,'huihui',13);
commit;

SQL>  select * from dept1;

DNO DNAME                POPULATION
---------- -------------------- ----------
        11 sale                          1
        12 market                        1
        13 study                         1
(发现里面population列的值跟着变了)

(1003这人,以前是13号部门,现在调岗到 12号部门)
update emp1 set dno=12 where eid=1003; 
 commit;
 
================================================
公司库存表(kucun) 同类产品的总量
分销商订货(xiaoshou) 时,kucun表数量减少
create table kucun(cid int,shul int);
insert into kucun values(100,9000);

SQL> select * from kucun;

CID       SHUL
---------- ----------
       100       9000

create table xiaoshou(cid int,shuliang int);
insert into xiaoshou values(100,1000);

SQL> select * from xiaoshou;

CID   SHULIANG
---------- ----------
       100       1000

SQL> create or replace trigger t12
   after insert on xiaoshou
    for each row
     begin
    if inserting then 
    update kucun set shul=shul-:new.shuliang where kucun.cid=:new.cid;
   
   end if;
   end;
  /

((特殊变量:   :new    :old
   :new代表你所新输入的数据
   :old代表更改前的数据
  使用方式 :old.列名
  
  insert 操作只有 :new
  delete 操作只有 :old
  update 操作 :new  :old 都有))

查看错误
SQL> show error

在存储过程中有一个叫游标的东西。

1、游标:用来处理从数据库中检索的多行记录(使用SELECT语句),通过遍历游标,我们可以对访问到每行记录的数据,并通过游标取出值,从而进行操作。

2、游标有什么用?
 ①指定结果集中特定行的位置。 
 ②基于当前的结果集位置检索一行或连续的几行。   
 ③直接利用游标更新数据,直接引用表中的行。 
 ④可以以编程的方式访问数据库。

3、游标分类

显示游标(Explicit Cursor):在PL/SQL程序中明确定义的,用于查询的游标称作显示游标。 
隐式游标(Implicit Cursor):没有PL/SQL程序中定义的,使用update/DELETE语句时,Oracle系统自动分配的游标。

4、使用步骤

显示游标:(1)定义 (2)打开 (3)使用(多次) (4)关闭 
隐式游标:对于隐式游标的操作,如定义、打开、取值及关闭操作,都由ORACLE 系统自动地完成,无需用户进行处理。

——————————————————————————————————————————————————————

——————————————————————————————————————————————————————

不知道大家发没发现我们分别使用了游标的两个状态:FOUND和NOTFOUND当然游标不可能就只有两个状态,来看看其他的

%Found :Fetch语句(获取记录)执行情况True or False。
  %NotFound : 最后一条记录是否提取出True or False。
  %ISOpen : 游标是否打开True or False。
  %RowCount :游标当前提取的行数 。

比如下面这个删除的例子:

——————————————————————————————————————————————————————

我们现在有了存储过程,这东西类似与java中我们写的程序,那么java中的方法是不是在Oracle中也有呢,于是我们发现了函数:

函数用于返回特定数据。在程序中调用执行时,如果你要使用函数的返回值,必须得找一个变量接收函数的返回值;
创建函数语法中return语句是必需的,并且返回值表达式的类型应与函数首部声明的返回值类型一致或赋值内容(系统能完成自动类型转换)。
当函数体中的returun语句返回值与函数首部由return定义的返回值类型不一致时,以函数首部的数据类型为准。

这个函数的功能就是格式化输出时间:

create or replace function current_time return varchar2
as
begin
return to_char(sysdate,'yyyy-mm-dd hh24:mi:ss');
end;
/

select current_time from dual;
 
 create table haha (i_date varchar2(100));
 
 insert into haha values(current_time());

当然Oracle也提供了很多能够用直接使用的函数,我们可以不用去编写,我们去编写的基本上都是生产中需要的。不知道大家还记不记得我们在myeclipse中新建java项目的时候在src文件夹下建了一个包,之后在包里创建class文件,Oracle中也有类似将我们写的存储过程整合起来的包,也就是程序包。

一个完整的包由说明部分、包主体两部分组成。
这两部分需要分别建立,并分开存储在数据库,其中包说明部分可以独立存在,就是说可以没有包主体。
只有说明部分的包,常用于全局变量和标志变量的说明。

包的说明部分(包头):用于声明包中全局数据对象和程序单元。
包的主体部分(包体):用于定义在说明部分中声明的函数和存储过程的具体实现。

1、创建说明部分(包头)
create or replace package pkg_emp as 
  function getEmpCount return number;
  procedure update_sal;
  procedure insert_emp(v_empno in number,v_ename in varchar2, v_sal in number, v_comm in number);
end pkg_emp;
/

2、创建主体
create or replace package body pkg_emp as
  function getEmpCount return number as
  begin
    declare emp_count number;
    begin
      select count(*) into emp_count from emp;
      return emp_count;
    end;
  end getEmpCount;

procedure update_sal as
  begin
    update emp set sal = sal * 3;
    commit;
  end update_sal;

procedure insert_emp(v_empno in number,v_ename in varchar2, v_sal in number, v_comm in number) as 
  begin
    begin
      insert into emp (empno ,ename,sal ,comm) values (v_empno ,v_ename,v_sal ,v_comm);
      commit;
    end;
  end insert_emp;

end pkg_emp;
/

3、调用程序包
(1)select pkg_emp.getEmpCount from dual;

(2)exec pkg_emp.update_sal;

(3)exec pkg_emp.insert_emp(1,'1',1,1);

对于有java基础的大家看这些东西应该很简单就可以理解了,剩下就是多打多练习。

接下来说说权限,还记得我们刚创建用户的时候用户没有登录Oracle的权限么?我们当时使用了sysdba用户进行了授权,那么常用的权限有哪些?

create session:连接数据库

create table:建表

create view:建视图

create procedure:建过程、函数、包

create trigger:建触发器

create cluster:建簇表

create public synonym:建同义词

当然权限有很多,Oracle提供160多种系统权限,而且Oracle版本越高,提供的系统权限越多。可以通过查询数据字典视图system_privilege_map显示所有系统权限。

select * from system_privilege_map order by name;

a)创建2个用户,ken、tom,初始阶段他们没有任何权限,如果登录就会报出错信息。

create user ken identified by ken;

create user tom identified by tom;

b)给用户ken授权

①grant create session,create table to ken with admin option;

②grant create view to ken;

c)用ken给用户tom授权

grant create session,create table to tom;
grant create view to tom;

权限被授出那就有被收回的可能性,一般情况下,回收系统权限是由dba完成的,如果其他用户来回收系统权限,要求该用户必须具有相应的系统权限及转授权系统权限的选项(with admin option),回收系统权限用revoke命令完成。

当回收系统权限后,用户就不能执行相应的操作了,但是请注意,系统权限级联回收问题。

比如用sys执行如下操作:revoke create session from ken;

请思考,tom还能登陆吗?----------能,系统权限不是级联回收。

接下来举一些例子:

1)对象权限介绍

对象权限指访问其他用户中对象的权力,用户可以直接访问自己的对象,当时如果要访问别的用户的对象,则必须要具有对象权限。

比如smith用户要访问scott.emp表(scott方案,emp表)

则必须在emp表上具有对象的权限。

常用的对象权限有:

alter:修改

delete:删除

select:查询

insert:添加

update:修改

index:索引

reference:引用

execute:执行

2)显示对象权限

通过数据字典视图dba_tab_privs可以显示用户或是角色具有的对象权限。

conn system/manager as sysdba;

select distinct privilege from dba_tab_privs;

select grantor,owner,table_name,privilege from dba_tab_privs where grantee='INDEX';

3)授予对象权限   A 用户(表操作权限)给  B(with grant option)   B再给C

在oracle9i之前,授予对象权限是由对象的所有者来完成的,如果其他用户来操作,则需要用户具有相应的(with grant option)权限,
从oracle9i开始,dba用户(sys,system)可以将任何用户中的对象的使用权限授予其他用户。授予对象权限是用grant命令 完成的。

对象权限可以授予用户、角色和public。在授予权限时,如果带有with grant option选项,则可以将该权限转授予给其他用户。
当时要注意,with grant option选项不能授予给角色。

例如:

a)monkey用户要操作scott.emp表,则必须授予相应的对象权限

①希望monkey可以查询scott.emp表数据,怎样操作?

grant select on scott.emp to monkey;

②希望monkey可以修改scott.emp表数据,怎样操作?

grant update on emp to monkey;

③希望monkey可以删除scott.emp表数据,怎样操作?

grant delete on emp to monkey;

④有没有更加简单的办法,一次性把所有权限赋给monkey?

grant all on emp to monkey;

4)授予alter权限

如果black用户要修改scott.emp表结构,则必须授予alter对象权限。

sql>conn scott/triger;

sql>grant alter on scott.emp to black;

当然也可以用sys,system来完成这件事儿。

5)授予execute权限

如果用户想要执行其他用户的存储过程、函数、包,则必须具有execute权限。

比如为了让ken可以执行存储过程 proc_helloworld,可以授予execute权限。

sql>conn system/manager;

sql>grant execute on proc_helloworld to ken;

6)授予index权限

如果想在别的用户中的表上建立索引,则必须具有index对象权限。

如:为了让black可以在scott.emp表上建立索引,就给其授予index的对象权限。

sql>conn scott/triger;

sql>grant index on emp to black;

7)系统使用with admin option选项,对象权限使用with grant option

该选项用于转授对象权限,当时该选项只能被授予用户,不能被授予角色。

create user black identified  by black;
create user jones identified  by jones;
grant create session to black,jones;

sql>sqlplus scott/lipengfei;

sql>grant select on emp to black with grant option;

sql>conn black/black;

sql>grant select on scott.emp to jones;-- 转授

8)收回对象权限

在oracle9i之后,收回对象权限可以由对象的所有者来完成,也可以由dba用户(sys、system)来完成。

说明:收回对象权限以后,用户就不能执行相应的sql命令,但是要注意,对象权限是否会被级联回收?

如:

scott <-------------------------à black ------------------à jones

(select on emp) (select on emp) (select on emp)

sql>conn scott/triger;

sql>revoke select on scott.emp from black;

请思考:jones还能查询scott.emp表的数据吗?

----------不能了,对象权限是级联删除的。

-----------------------------------------------------------------------
SQL> create tablespace tbs_icbc datafile '/oracle/app/oradata/ecom/tbs_icbc.dbf' size 10M;

查看库下用户
select * from all_users;

查看当前登录用户信息
select * from user_users;

创建用户
SQL> create user icbc identified by icbc  default tablespace tbs_icbc; 
【alter user icbc quota unlimited on tbs_icbc;(不限制空间)】

SQL> conn icbc/icbc(不能登陆,没有创建会话权限)
ERROR:
ORA-01045: user ICBC lacks CREATE SESSION privilege; logon denied

SQL> grant create session to icbc;(sys用户登陆下)[系统权限]
SQL> conn icbc/icbc(可以正常登陆)
SQL> show user
USER is "ICBC"

查看用户默认表空间
select default_tablespace from dba_users where username='ICBC';(sys用户登陆下)

修改用户默认表空间
SQL> alter user icbc default tablespace system;(sys用户登陆下)

1.
SQL> create table tt(id int);(报错 没有创建表的权限)
create table tt(id int)
*
ERROR at line 1:
ORA-01031: insufficient privileges

2.
SQL> grant create table to icbc;(sys用户登陆下)

3.
SQL> create table tt(id int);(在表空间上权限不足,没有给用户空间配额)

4.SQL> alter user icbc quota 1M on tbs_icbc;(赋予用户空间配额,sys用户下)
  或
  SQL> alter user icbc quota unlimited on tbs_icbc;(不限制空间)

SQL> alter user icbc quota 1M on system;(赋予用户空间配额,sys用户下)
  或
  SQL> alter user icbc quota unlimited on system;(不限制空间)

5.SQL> create table tt(id int) tablespace tbs_icbc; 可以创建

SQL> conn scott/lipengfei
SQL> grant select on scott.emp to icbc;(scott用户下)
(赋予icbc用户读 scott用户emp权限)

conn icbc/icbc
SQL> create table t_big tablespace tbs_icbc as select * from scott.emp;(icbc用户下)[对象权限]
SQL> insert into t_big select * from t_big;
SQL> / (多次执行一直到超出配额限制)

SQL> select count(*) from t_big;
  COUNT(*)
----------
    114688

删除icbc 并把用户下所有对象
SQL> drop user icbc cascade;

-------------------------------
角色:角色是一组权限的集合,将角色赋给一个用户,这个用户就拥有了这个角色中的所有权限。

oracle一共提供了33种预定义角色:

select * from dba_roles;

在Oracle中,权限太多一一分配会很累,所以提出一种内置多种基本权限的集合,称为角色;

1.预定义角色
CONNECT, RESOURCE, DBA
DBA: 拥有全部特权,是系统最高权限,只有DBA才可以创建数据库结构。
RESOURCE(资源):拥有Resource角色的用户只可以创建实体,不可以创建数据库结构。
CONNECT:拥有Connect角色的用户只可以登录Oracle,

SQL> grant dba to scott;
SQL> revoke dba from scott;(回收角色)

查询用户拥有哪里权限
select * from dba_role_privs;(查看哪个用户创建的角色)

select * from dba_sys_privs; (查看用户权限)

select * from role_sys_privs;(查看角色中的权限)

select privilege from role_sys_privs where role='RESOURCE';(查看指定角色包括的权限)
select privilege from role_sys_privs where role='CONNECT';

2.对象权限
select, update, insert, alter, index, delete, all on

3.自建立角色
SQL> create role role1;

给角色赋权限(创建表和创建储存过程)
SQL> grant create any table,create procedure to role1;

create role emp_all;
grant select,delete,update,insert on scott.emp to emp_all;

create user nimei identified by nimei;
grant create session to nimei;

把角色 赋予用户
SQL> grant emp_all to nimei;

删除角色
SQL> drop role emp_all;

-------------------------------------------------------
验证模式:
1.系统认证
2.密码文件认证

[oracle@oracle1 admin]$ vi $ORACLE_HOME/network/admin/sqlnet.ora 
NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT)

此时本地sys用户的认证方式为系统认证,即可以 sqlplus / as sysdba 方式登录

如果在sqlnet.ora 中额外添加:
  SQLNET.AUTHENTICATION_SERVICES= (NTS)   或  SQLNET.AUTHENTICATION_SERVICES= (NONE)
  NTS:为windows专用     linux用 NONE

把SQLNET.AUTHENTICATION_SERVICES= (NONE) 添加到NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT)上面

再次登陆时 sys需要密码

------------------------------------------
profile 里参数
LOGICAL_READS_PER_CALL:指定一次执行SQL(解析、执行和提取)调用所允许读的数据块的最大数目。

CONNECT_TIME:指定会话的总的连接时间。(单位:分钟)

PRIVATE_SGA:指定一个会话可以在共享池(SGA)中所允许分配的最大空间(单位:字节)
注:该限制只在使用共享服务器结构时才有效,会话在SGA中的私有空间包括私有的SQL和PL/SQL,但不包括共享的SQL和PL/SQL

PASSWORD_LIFE_TIME:指定同一密码所允许使用的天数。
password_reuse_time指定了密码不能重用前的天数
password_reuse_max则指定了当前密码被重用之前密码改变的次数

用户会话限制
1.创建配置文件 限制用户3个会话
SQL> create profile PRO_TEST limit sessions_per_user 3;

2.
SQL> alter user SCOTT profile PRO_TEST;(给scott用户应用)

3.
SQL> show parameter limit(限制默认为关闭状态)

SQL> alter system set resource_limit=true;打开限制
SQL> show parameter limit

4.[oracle@sq ~]$ sqlplus scott/lipengfei (操作三次)

5.第四次

SQL> conn scott/abc
ERROR:
ORA-02391: exceeded simultaneous SESSIONS_PER_USER limit

SQL> drop profile PRO_TEST cascade;(已分配的profile,删除时必须加cascade选项,DEFAULT为默认profile,不能删除)

alter system kill session 'sid,serial#';

--查看当前用户的sid(此方式适用于sys用户)
SQL> select sid from v$mystat where rownum=1;
 
       SID
----------
        20

下一篇将会介绍关于索引的知识

大数据培训之旅——Oracle-8(存储过程,权限)相关推荐

  1. 大数据培训之旅——Oracle-6(体系结构)

    来说说oracle的体系结构,这东西理论更多了--先给大家看个图片 ------------------------------------------------------ 我们用的客户端就是Us ...

  2. 大数据培训之旅——Java-9(设计模式、Java Web)

    java终于要完事了,最后一篇Java的文章,设计模式和Java Web,当然因为我们不是纯Java开发,所以这俩了解了解就可以了.这篇应该是文字最多的了.Java之后应该就是Oracle数据库了.如 ...

  3. 大数据培训之旅——Oracle-2(基础操作,数据字典,基础SQL)

    我们在上一篇里把Oracle10g安装好了,那么也算是有工具了,下面就得看看如何使用了. ------------------------------------------------------ ...

  4. 2018大数据培训学习路线图(详细完整版)

    2018大数据培训学习路线全课程目录+学习线路详解(详细完整版) 第一阶段:大数据基础Java语言基础阶段 1.1:Java开发介绍 1.1.1 Java的发展历史 1.1.2 Java的应用领域 1 ...

  5. 大数据课程培训大纲详解,大数据培训学习内容

    大数据助力成就非凡.大数据正在改变着商业游戏规则,为企业解决传统业务问题带来变革的机遇.毫无疑问,当未来企业尝试分析现有海量信息以推动业务价值增值时,必定会采用大数据技术.那么大数据培训哪家好呢?今天 ...

  6. 大数据培训 | 数据仓库构建方法论和实践

    数据仓库的价值 构思一个主题讨论数据仓库的构建方法论,包括数据仓库的价值.选型.构建思路,随着数据规模膨胀和业务复杂度的提升,大型企业需要构建企业级的数据仓库(数据湖)来快速支撑业务的数据化需求,与传 ...

  7. 大数据培训Hive的数据存储与压缩

    行存储与列存储 当今的数据处理大致可分为两大类,联机事务处理 OLTP(on-line transaction processing)联机分析处理 OLAP(On-Line Analytical Pr ...

  8. 商业方向的大数据专业_好程序员大数据培训分享大数据就业方向有哪些

    好程序员大数据培训分享大数据就业方向有哪些?看到了大数据的就业前景及就业薪资,相信很多人都对大数据技术跃跃欲试,想要学习大数据技术.小编认为在学习大数据之前,你还需要了解一下大数据的就业方向有哪些?毕 ...

  9. 大数据培训就业班毕业后通常可以从事哪些领域做哪些方面工作

    近年来随着大数据技术的不断提升,产业规模空前,其应用的覆盖范围不断扩大,已渗透到了生产.消费.流通等各个领域,其在引发新一轮科技革命和产业升级的同时,也对全球的经济.社会及国家治理等各方面都有着重要影 ...

最新文章

  1. java script 6 折线_Java入门第六篇:Java script(js)的事件
  2. e语言怎么连接mysql_大佬们E语言连接MYSQL输出中文乱码怎么破
  3. java Socket Tcp 浏览器和服务器(一)
  4. 江苏理工学院计算学院实验教学管理系统[.NET项目]
  5. 射频篇(二) 模拟、射频器件学习(2) ——功分器(Power divider)
  6. codeforces Educational Codeforces Round 49 (Rated for Div. 2) C题
  7. 【经验谈】开发工程师人生之路
  8. I want go to school
  9. LeetCode-MySQL-174. 第二高的薪水
  10. 使括号有效的最少添加
  11. python跳转下一页_Python网页浏览转到下一页
  12. Python简易验证码生成程序
  13. 四阶行列式直接展开_【Just For Fun】n 階行列式計算 宏 生成器,四阶行列式的最优展开...
  14. linux 静态库、共享库
  15. 利用java poi对excel表的读写操作
  16. SDN技术的十个关键因素
  17. Windchill二次开发-自定义文件编号(1)
  18. nodejs+vue+elementui休闲娱乐美食优惠卷商城销售系统
  19. 安卓使用服务完成音乐播放器
  20. 北京中亦安图科技股份有限公司企业介绍_脑图

热门文章

  1. 正则里的(.*?)是什么意思
  2. Java在线教育项目 第八天黑马头条
  3. CDMA直放站引入噪声的分析及对策(转)
  4. 通达OA-今日学习:Office_Anywhere服务已经启动了,但仍打不开页面或很慢,怎么办?
  5. MATLAB各种二维绘图函数
  6. 计算机设备管理器没有网络适配器,分享Win10设备管理器没有网络适配器的解决方法...
  7. Lora远程水表抄表
  8. CAD软件中如何绘制特殊符号?
  9. 数据分析-spss5.06
  10. flex结合Lcds整合spring