zoukankan      html  css  js  c++  java
  • Oracle Day7

    本节内容

      1.数据库安全性

      2.创建用户/删除用户/修改用户/解锁与锁定用户

      3.系统权限管理

      4.对象权限管理

      5.角色管理

      6.PL/SQL编程

    一、数据库安全性

          数据库中存储的是数据,那么在这个互联网发达的时代,对于互联网公司来说什么最值钱:当然是数据。所以数据的安全性非常重要。

     Oracle中对数据的安全性的防护:

         1.数据库登录需要用户名密码。

         2.操作数据库需要相应的权限。

    二、用户的操作

      创建用户:需要管理员来创建 system。或者超级管理员sys

       创建用户:

          

    create user 用户名 IDENTIFIED BY 密码
    

    修改用户密码

    alter  user  用户名  IDENTIFIED BY 密码
    

    删除用户:

      

    drop user 用户名 Cascade  //删除用户下所有的数据库对象
    

    锁定用户与解锁用户

    alter user  用户名  account  lock //锁定
    
    alter  user 用户名  account  unlock//解锁
    

      

    三、数据库权限

        系统权限:控制用户的登录,创建数据库对象的权限。

       管理员可以为用户授权

         

    GRANT  权限  TO 用户名 [with admin option]
    
    with admin option 选项表示该用户可以将这种系统权限授予其他用户
    

    收回权限

    REVOKE  权限  FROM   用户名
    

      

      

        对象权限:

     不同的对象具有不同的对象权限
    对象的拥有者拥有所有权限
    对象的拥有者可以向外分配权限   

    给对象授权:

       

    GRANT 权限
    on  对象
    to  用户 
    [WITH GRANT OPTION];
    
    WITH GRANT OPTION//被授权用户可将所获得的权限再次授予其它用户
    

    给用户赋予表空间

    给用户赋予表空间:
    alter user 用户名  quota unlimited on users
    

    收回对象权限

    REVOKE 权限
    on  对象
    from 用户名
    使用 WITH GRANT OPTION 子句所分配的权限同样被收回
    

      

    角色管理

       我们的权限是非常多的,那么如果我们要给多个用户授权那么就很麻烦,所以我们使用角色来管理权限。

      创建角色

        

    CREATE ROLE  角色名
    

    给角色授权

    GRANT 权限  TO 角色名
    

    这样以后我们要给用户授权只需要将角色授予这个用户就可以了。

    将角色赋予用户:
    GRANT   角色  TO  用户名
    

    删除角色

    删除角色
    DROP ROLE  角色名
    

    在oracle数据库中有2个预定义的角色,这2个角色包含了我们开发中所使用的有所权限

    connect,resource

    所以我们只要将这2个角色赋予用户就可以达到我们开发的要求。  

    四、PL/SQL编程

         我们使用PL/SQL工具类进行oracle数据库的开发

              PL/SQL程序的基本结构。

                     PL/SQL程序由3部分组成: 声明部分    执行部分(必须的)   异常处理部分

                     

    DECLARE  
       /* 声明部分: 在此声明PL/SQL用到的变量,类型及游标,以及局部的存储过程和函数 */
    BEGIN
       /*  执行部分:  过程及SQL 语句  , 即程序的主要部分 */
    EXCEPTION
       /* 执行异常部分: 错误处理  */
    END;
    

     PL/SQL程序块可以分为3类:

    匿名块:动态构造,只能执行一次 (一般的sql语句)
    子程序:存储在数据库中的存储过程、函数及包等。当在数据库上建立好后可以在其它程序中调用它们
    触发器:当数据库发生操作时,会触发一些事件,从而自动执行相应的程序 

    变量 :

             声明变量:

                    

    变量名    [constant]  类型  [not null] [:=值]
    变量赋值 
    变量名:=值
    
    声明常量:
    变量名  constant 类型  :=值 
    
    注意:如果变量在声明时使用了NOT NULL选项则必须为变量指定初值。
          如果变量在声明时使用了CONSTANT选项则必须为变量指定初值,并且该初值不能被改变
    

    使用:select ...into 语句可以把查询出的一条数据赋值给变量。

    注意: 用select… into…语句给变量赋值必须要查询返回一条记录,不能多条记录,也不能没有记录

    declare   
     v_ename varchar2(20);    
    begin    
      select first_name into v_ename from employees     	where employee_id=&no;
      dbms_output.put_line(v_ename);//输出语句
    end;
    

    PL/SQL编程中的复合类型:

             有时我们表中的列非常多的化,使用上面的变量方式不是很方便

            记录类型 :记录类型是把逻辑相关的数据作为一个单元存储起  

      

    义记录类型语法如下:
    TYPE record_type IS RECORD(
       Field1 type1  [NOT NULL]  [:= exp1 ],
       Field2 type2  [NOT NULL]  [:= exp2 ],
       . . .   . . .
       Fieldn typen  [NOT NULL]  [:= expn ] ) ; 
    
    %TYPE:定义一个变量,其数据类型与已经定义的某个数据变量的类型相同,或者与数据库表的某个列的数据类型相同	,这时可以使用%TYPE
    
    DECLARE
       -- 用 %TYPE 类型定义与表相配的字段
     type type_emp is record(
         empno employees.employee_id%type,
         ename employees.first_name%type,
         sal   employees.salary%type);   
    
    -- 声明接收数据的变量
       v_emp type_emp ; 
    
    declare
      type type_emp is record(
        empno employees.employee_id%type,
        ename employees.first_name%type,
        sal   employees.salary%type);
        v_emp type_emp;
    begin
      	select employee_id, first_name, salary into 			v_emp 
       	from employees 
        	where employee_id = &no;
          	dbms_output.put_line(v_emp.empno || '/' || 	v_emp.ename || '/' ||v_emp.sal);
    end;
    
    %ROWTYPE:返回一个记录类型, 其数据类型和数据库表的数据结构相一致。
    例:DECLARE
        	v_empno employees.employee_id%TYPE :=&no;
       	rec employees%ROWTYPE;
            BEGIN
        	SELECT * INTO rec FROM employees 
                  WHERE employee_id=v_empno;
        	DBMS_OUTPUT.PUT_LINE('姓名:'||rec.first_name||'工	资:'||rec.salary||'入职时间:'||to_char(rec.hire_date,'yyyy-mm-	dd')); 
            END; 
    

    PL/SQL中的流程控制

          条件结构:

              

    IF <布尔表达式> THEN
    		PL/SQL 和 SQL语句
    END IF;
    或
    IF <布尔表达式> THEN
    		PL/SQL 和 SQL语句
    ELSIF 布尔表达式 THEN
             PL/SQL 和 SQL语句
    
    ELSE
    		其它语句
    END IF; 
    
    declare
      v_sal employees.salary%type;
    begin
      select salary into v_sal
      from employees
      where employee_id = &no;
      
      if v_sal >= 20000 then
         dbms_output.put_line('土豪');
      elsif  v_sal >=10000 then
         dbms_output.put_line('白领');
      elsif  v_sal >=8000 then      
         dbms_output.put_line('蓝领');
      else
         dbms_output.put_line('没领');
      end if;
    end;
    

      

      

               选择结构:

    CASE语句的基本形式为 :
    CASE selector
    	WHEN expression1 THEN result1
    	WHEN expression2 THEN result2
    	WHEN expressionN THEN resultN
    				[ ELSE resultN+1]
    END [CASE];
    其中:ELSE子句是可选的,但是当检测表达式与任何一个检测值都不匹配时,PL/SQL会产生预定义错误CASE_NOT_FOUND,其错	误号是ORA-6592
    

     

     -- 相当于switch语句
     
     
    declare  
       
      a number:=&a;
      
    begin
        
        case a
          when 60 then
            dbms_output.put_line('刚及格'); 
           
          when 80 then 
              dbms_output.put_line('良好'); 
          
         when 90 then
            dbms_output.put_line('优秀');
             
         else
             dbms_output.put_line('没有这个选项');
         end case;
         
    end;
    

      

     

               循环结构:

                简单循环:

                

    LOOP
      要执行的语句;
      EXIT WHEN <条件语句> /*条件满足,退出循环语句*/
    END LOOP;
    
    FOR 循环计数器 IN [ REVERSE ] 下限 .. 上限  LOOP
                   要执行的语句;
    END LOOP; 
    其中:
    每循环一次,循环变量自动加1;使用关键字REVERSE,循环变量自动减1
    跟在IN REVERSE 后面的数字必须是从小到大的顺序,但不一定是整数,可以是能够转换成整数的变量或表达式
    可以使用EXIT WHEN子句退出循环 
    

     

    --2.循环结构
    --do...while...循环
    declare
      v_no number(10) := 0;
      v_sum number(10) := 0;
    begin
      loop
        v_sum := v_sum + v_no;
        v_no := v_no + 1;
        exit when v_no = 10;
      end loop;
      dbms_output.put_line('和为:' || v_sum);
    end;
    
    --while...循环
    declare
      v_no number(10) := 0;
      v_sum number(10) := 0;
    begin
      while v_no<10 loop
        v_sum := v_sum + v_no;
        v_no := v_no + 1;
      end loop;
      dbms_output.put_line('和为:' || v_sum);
    end;
    
    --for循环
    declare
      v_no number(10) := 0;
    begin
       for v_no in 0..10 loop
         dbms_output.put_line('值为:' || v_no);
       end loop;  
    end;
      
    declare
      v_no number(10) := 0;
    begin
       for v_no in reverse 0..10 loop
         dbms_output.put_line('值为:' || v_no);
       end loop;  
    end;
    

      

     

      

              GOTO语句:

              

    GOTO   label;
     . . .  . . .
    <<label>> /*标号是用<< >>括起来的标识符 */ 
    其中:
    GOTO语句是无条件跳转到指定的标号去的意思 
    
    begin
      
    for  a in reverse 10..20 loop
      
     dbms_output.put_line(a);
     --无条件跳转语句
     goto flag;
    
    end loop;
    
     <<flag>>
         dbms_output.put_line('这是goto语句');  
    
    end;
    

      

    PL/SQL中的异常:

    PL/SQL利用异常处理机制捕获并响应错误。异常处理机制允许你将错误处理代码与可执行语句清楚的分开。任何类型的错误都被视为程序中不该发生的异常情形。异常可以是以下之一:
    系统产生的错误(比如“内存用尽”或者“相同的  索引值”)
    用户操作造成的错误
    应用程序给用户提出的警告
     
    异常的类型:

     异常一般都出现在PL/SQL程序块的后半部分

        

    begin
      
    declare
    
    
    
    
    
    
    EXCEPTION
       WHEN first_exception THEN  <code to handle first exception >
       WHEN second_exception THEN  <code to handle second exception >
       WHEN OTHERS THEN  <code to handle others exception >
    END; 

    异常处理可以按任意次序排列,但 OTHERS 必须放在最后

     命名的系统异常:

         

    declare
     
       e_id employees.employee_id%type:=&e_id;
        sal employees.salary%type;
    begin
        
       select salary into sal from employees where employee_id=e_id;
       
    exception
       --异常处理
      -- when no_data_found  then
        -- dbms_output.put_line('没有这个员工');
        --可以处理所有异常
       when others then
         dbms_output.put_line('没有这个员工');
        
     end; 
    

      

     未命名的系统异常:

      系统只定义了错误号而没有给启异常名

     declare
     
         notnull exception;
         
         pragma exception_init(notnull,1722);
        -- e_id employees.employee_id%type:=&no;
         emp employees%rowtype;
        begin
          
           select * into emp  from employees where employee_id='小明'; 
           
       exception
     
             
        when  notnull then
              dbms_output.put_line(sqlcode||'  '||sqlerrm);
     
     
       end;
    

      命名的用户自定义异常

          用户定义的异常是通过显式使用 RAISE 语句来触发。当引发一个异常时,控制就转向到 EXCEPTION块异常部分,执行异常处理代码

          这类异常情况的处理,步骤如下 :
      在PL/SQL 块的声明部分定义异常情况 :
           <异常情况>  EXCEPTION;
       RAISE <异常情况>
       在PL/SQL 块的异常情况处理部分对异常情况做出相应的处理

       

     declare
        a number:=10;
        notnull exception;
        
        begin
          
          if a<20 then
            RAISE notnull;
            
          end if;
          
          exception
            
            when notnull then
              
        dbms_output.put_line('这个值不符合要求');
        end;
    

      

    未命名的用户自定义异常:

      

    --未命名的用户自定义异常
        
        
        declare 
           e_id employees.employee_id%type:=&no;
           e_name employees.last_name%type;
           
           begin
             
             select last_name into e_name from employees where employee_id=e_id;
               dbms_output.put_line(e_name);
          exception
             when others then
                raise_application_error(-20002,'不存在这个员工');
                
                
             end;  
    

      

         

                

      

     

              

      

      

      

      

      

      

           

  • 相关阅读:
    SpringBoot,来实现MySQL读写分离技术
    range范围
    tuple元组
    序列通用操作及可变序列通用操作
    list列表
    数据
    python基础知识
    charm写代码时添加快捷键
    2、添加到项目里 在⚙图标里选择Add Remote...charm初期设置(远程服务器)
    5、优化
  • 原文地址:https://www.cnblogs.com/wuzhilong/p/9476005.html
Copyright © 2011-2022 走看看