精华内容
下载资源
问答
  • oracle 安全基线检查

    千次阅读 2016-11-16 10:29:17
    oracle 安全基线检查1.限制超级管理员远程登录检查方法: 使用sqlplus检查参数设置。 SQL> show parameter REMOTE_LOGIN_PASSWORDFILE,参数REMOTE_LOGIN_PASSWORDFILE设置为NONE;修订算法: SQL> alter system set ...

    oracle 安全基线检查

    1.限制超级管理员远程登录

    检查方法:
    使用sqlplus检查参数设置。
    SQL> show parameter REMOTE_LOGIN_PASSWORDFILE,参数REMOTE_LOGIN_PASSWORDFILE设置为NONE;
    
    修订算法:
    SQL> alter system set remote_login_passwordfile=none scope=spfile;
    SQL> shutdown immediate
    SQL> startup

    2.用户属性控制

    检查方法:
    查询视图dba_profiles和dba_users来检查profile是否创建。
    SQL> Select profile from dba_profiles;
    SQL> Select profile from dba_users;
    存在default以外的profile即可
    
    修订算法:
    SQL> create profile maintenance limit  PASSWORD_VERIFY_FUNCTION F_PASSWORD_VERIFY
    PASSWORD_REUSE_MAX 5
    PASSWORD_GRACE_TIME 60
    FAILED_LOGIN_ATTEMPTS 6
    PASSWORD_LIFE_TIME 90;

    3.数据字典访问权限

    检查方法:
    使用sqlplus检查参数,
    SQL> show parameter O7_DICTIONARY_ACCESSIBILITY
    参数O7_DICTIONARY_ACCESSIBILITY设置为FALSE
    
    修订算法:
    SQL> alter system set O7_DICTIONARY_ACCESSIBILITY=FALSE scope=spfile;
    SQL> shutdown immediate
    SQL> startup

    4.账户口令的生存期

    检查方法:
    执行
    select dba_profiles.profile,resource_name, limit 
    from dba_profiles, dba_users 
    where dba_profiles.profile = dba_users.profile 
        and dba_users.account_status='OPEN' 
        and resource_name='PASSWORD_GRACE_TIME';
    查询结果中PASSWORD_GRACE_TIME小于等于90。
    
    修订算法:
    SQL> alter profile default limit PASSWORD_GRACE_TIME 60;

    5.重复口令使用

    检查方法:
    执行
    select dba_profiles.profile,resource_name, limit 
    from dba_profiles, dba_users 
    where dba_profiles.profile = dba_users.profile 
        and dba_users.account_status='OPEN' 
        and resource_name='PASSWORD_REUSE_MAX';
    查询结果中PASSWORD_REUSE_MAX大于等于5。
    
    修订算法:
    SQL> alter profile default limit PASSWORD_REUSE_MAX 5;

    6.认证控制

    检查方法:
    执行
    select dba_profiles.profile,resource_name, limit 
    from dba_profiles, dba_users 
    where dba_profiles.profile = dba_users.profile 
        and dba_users.account_status='OPEN' 
        and resource_name='FAILED_LOGIN_ATTEMPTS';
    查询结果中FAILED_LOGIN_ATTEMPTS等于6。
    
    修订算法:
    SQL>alter profile default limit FAILED_LOGIN_ATTEMPTS 6;

    7.更改默认帐户密码

    检查方法:
    sqlplus '/as sysdba'
    conn system/system
    conn system/manager 
    conn sys/sys
    conn sys/cHAnge_on_install 
    conn scott/scott
    conn scott/tiger
    conn dbsnmp/dbsnmp 
    conn rman/rman
    conn xdb/xdb
    以上均不能成功登录
    
    修订算法:
    不要有空口令和弱口令

    8.密码更改策略

    检查方法:
    执行
    select profile,limit from dba_profiles 
    where resource_name='PASSWORD_LIFE_TIME' 
        and profile in (select profile from dba_users where account_status='OPEN');
    查询结果中PASSWORD_LIFE_TIME小于等于90。
    
    修订算法:
    SQL> alter profile default limit PASSWORD_LIFE_TIME 90;

    9.密码复杂度策略

    检查方法:
    执行
    select limit from dba_profiles 
    where resource_name = 'PASSWORD_VERIFY_FUNCTION' 
    and profile in (select profile from dba_users where account_status = 'OPEN');
    select text from dba_source where name='PASSWORD_VERIFY_FUNCTION';
    查询结果中不为“NULL”且策略为口令长度至少8位,并包括数字、小写字母、大写字母和特殊符号4类中至少3类
    
    修订算法:
    创建复杂度策略
    使用 sys 用户登录,执行如下脚本:
    D:\app\administrator\product\11.2.0\dbhome_1\RDBMS\ADMIN\utlpwdmg.sql
    oracle 10g, 必须使用sys用户登录,oracle 11g,可以使用 system创建;
    
    然后执行如下脚本:
    ALTER PROFILE DEFAULT LIMIT
    PASSWORD_LIFE_TIME 90
    PASSWORD_GRACE_TIME 60
    PASSWORD_REUSE_TIME UNLIMITED
    PASSWORD_REUSE_MAX 5
    FAILED_LOGIN_ATTEMPTS 6
    PASSWORD_LOCK_TIME 1
    PASSWORD_VERIFY_FUNCTION verify_function;

    10.数据库审计策略

    检查方法:
    1.使用参数设置,
    SQL> show parameter audit_trail
    参数audit_trail不为NONE。
    检查dba_audit_trail视图中或$ORACLE_BASE/admin/adump目录下是否有数据。
    2.查看审计表,检查是否有用户登录、操作记录
    select * from LOGON_AUDIT.LOGON_AUDIT;
    
    修订算法:
    SQL> alter system set audit_trail=os scope=spfile;
    SQL> shutdown immediate
    SQL> startup

    11.设置监听器密码

    检查方法:
    检查$ORACLE_HOME/network/admin/listener.ora文件中是否设置参数PASSWORDS_LISTENER。
    
    修订算法:
    $ ps -ef|grep tns
    $ lsnrctl
    LSNRCTL> set current_listener listener 
    LSNRCTL> change_password
    LSNRCTL> save_config
    LSNRCTL> set password  
    LSNRCTL> exit

    12.限制用户数量

    检查方法:
    检查文件/etc/group,确认除oracle安装用户无其它用户在DBA组中。
    
    修订算法:
    

    13.使用数据库角色(ROLE)来管理对象的权限

    检查方法:
    检查应用用户未授予dba角色:
    select * from dba_role_privs where granted_role='DBA';
    
    修订算法:
    create role
    grant 角色 to username; 
    revoke DBA from username; 

    14.连接超时设置

    检查方法:
    检查sqlnet.ora文件:
    $ cat $ORACLE_HOME/network/admin/sqlnet.ora
    查看文件中设置参数SQLNET.EXPIRE_TIME=15。 
    
    修订算法:
    $ vi sqlnet.ora
    SQLNET.EXPIRE_TIME=10

    15.安全补丁

    检查方法:
    查看oracle补丁是否为最新,
    $ opatch lsinventory
    
    修订算法:
    升级为最新补丁,需要Oracle Metalink 帐号下载安全补丁。

    16.可信IP地址访问控制

    检查方法:
    1.检查sqlnet.ora中是否设置
    tcp.validnode_checking = yes,
    tcp.invited_nodes :
    $ cat $ORACLE_HOME/network/admin/sqlnet.ora
    
    修订算法:
    $ vi sqlnet.ora
    tcp.validnode_checking = yes 
    tcp.invited_nodes = (ip1,ip2…) 

    17.资源控制

    检查方法:
    查看空闲超时设置:
    select profile,limit from dba_profiles where profile='DEFAULT' and resource_name='IDLE_TIME';
    
    修订算法:
    IDLE_TIME返回结果应大于0

    18.重要信息资源设置敏感标记

    检查方法:
    1、询问数据库管理员是否对重要数据设置了敏感标记
    2、检查是否安装Oracle Label Security 模块:select username from dba_users;
    3、查看是否创建策略:select policy_name,status from dba_sa_policies;
    4、查看是否创建级别:select * from dba_sa_levels order by level_num;
    5、查看标签创建情况:select * from dba_sa_labels;
    6、询问重要数据存储表格名称
    7、查看策略与模式、表对应关系:select * from dba_sa_table_policies;判断是否针对重要信息资源设置敏感标签。
    
    修订算法:
    1、安装了Oracle Label Security模块
    2、可以查询到Oracle Label Security对象的用户LBACSYS
    3、创建了相应的策略
    4、创建了相应的级别
    5、创建了标签
    6、针对重要数据设置了敏感标记
    展开全文
  • Oracle SCN与检查

    千次阅读 2016-07-15 15:16:06
    1.SCN 的定义SCN(System Change Number ),也就是通常所说的...SCN 同时被作为 Oracle数据库的内部时钟机制,可被看作逻辑时钟,每个 数据库都有一个全局的 SCN 生成器。作为数据库内部的逻辑时钟,数据库事务依 SCN

    1.SCN 的定义

    SCN(System Change Number ),也就是通常所说的系统改变号,是数据库中非常重要的 一个数据结构。本文地址:http://blog.csdn.net/sunansheng/article/details/51917941

    SCN 用以标识数据库在某个确切时刻提交的版本。在事务提交时,它被赋予一个惟一的 标识事务的SCN。SCN 同时被作为 Oracle数据库的内部时钟机制,可被看作逻辑时钟,每个 数据库都有一个全局的 SCN 生成器。

    作为数据库内部的逻辑时钟,数据库事务依 SCN 而排序,Oracle 也依据 SCN 来实现一致性读 (Read Consistency )等重要数据库功能。另外对于分布式事务(Distributed Transactions), SCN 也极为重要,这里不作更多介绍。

    SCN 在数据库中是惟一的,并随时间而增加,但是可能并不连贯。除非重建数据库,SCN 的值永远不会被重置为 0。

    一直以来,对于 SCN 有很多争议,很多人认为 SCN 是指 System Commit Number ,而通常 SCN 在提交时才变化,所以很多时候,这两个名词经常在文档中反复出现。即使在Oracle 的 官方文档中,SCN 也常以 System Change/Commit Number 两种形式出现。 到底是哪个词其实不是最重要的,重要的是需要知道 SCN 是Oracle内部的时钟机制, Oracle通过SCN 来维护数据库的一致性,并通过 SCN 实施Oracle至关重要的恢复机制。 SCN 在数据库中是无处不在的,常见的事务表、控制文件、数据文件头、日志文件、数 据块头等都记录有 SCN 值。

    冠以不同前缀,SCN 也有了不同的名称,如检查点SCN(Checkpoint SCN )、Resetlogs SCN 等。

    2.SCN 的获取方式

    可以通过如下几种方式获得数据库的当前或近似 SCN。

    1
    2
    3
    4
    5
    6
    
    SQL> SELECT dbms_flashback.get_system_change_number FROM  DUAL; 
    GET_SYSTEM_CHANGE_NUMBER
    ------------------------
               6051905241299
    
    SQL>
    

    3.SCN 的进一步说明

    系统当前SCN 并不是在任何的数据库操作发生时都会改变,SCN 通常在事务提交或回滚 时改变。在控制文件、数据文件头、数据块、日志文件头、日志文件 change vector 中都有 SCN,但其作用各不相同。

    (1)数据文件头中包含了该数据文件的 Checkpoint SCN,表示该数据文件最近一次执行 检查点操作时的 SCN。

    对于每一个数据文件都包含一个这样的条目,记录该文件的检查点 SCN 的值以及检查点 发生的时间,这里的Checkpoint SCN 、Stop SCN以及 Checkpoint Cnt 都是非常重要的数据 结构.

    4.检查点


    许多文档把Checkpoint 描述得非常复杂,为我们正确理解检查点带来了障碍,结果现在 检查点变成了一个非常复杂的问题。实际上,检查点只是一个数据库事件,它存在的根本意 义在于减少崩溃恢复(Crash Recovery )时间。

    当修改数据时,需要首先将数据读入内存中(Buffer Cache),修改数据的同时,Oracle 会记录重做信息(Redo)用于恢复。因为有了重做信息的存在,Oracle 不需要在提交时立即 将变化的数据写回磁盘(立即写的效率会很低),重做(Redo)的存在也正是为了在数据库崩 溃之后,数据可以恢复。

    最常见的情况,数据库可能因为断电而 Crash,那么内存中修改过的、尚未写入文件的 数据将会丢失。在下一次数据库启动之后,Oracle 可以通过重做日志(Redo)进行事务重演 (也就是进行前滚),将数据库恢复到崩溃之前的状态,然后数据库可以打开提供使用,之后 Oracle可以将未提交的事务进行回滚。

    在这个过程中,通常大家最关心的是数据库要经历多久才能打开。也就是需要读取多少 重做日志才能完成前滚。当然用户希望这个时间越短越好,Oracle 也正是通过各种手段在不 断优化这个过程,缩短恢复时间。

    检查点的存在就是为了缩短这个恢复时间。

    当检查点发生时(此时的SCN 被称为Checkpoint SCN ),Oracle会通知DBWR进程,把 修改过的数据,也就是此Checkpoint SCN之前的脏数据(Dirty Data)从Buffer Cache 写入磁盘,当写入完成之后,CKPT进程更新控制文件和数据文件头,记录检查点信息,标 识变更。

    Checkpoint SCN 可以从数据库中查询得到:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    SQL>  select file#,NAME,CHECKPOINT_CHANGE#,to_char(CHECKPOINT_TIME,'yyyy -mm-dd hh24:mi:ss') CPT from v$datafile; 
         FILE# NAME                                                                             CHECKPOINT_CHANGE# CPT
    ---------- -------------------------------------------------------------------------------- ------------------ --------------------
             1 /u01/app/oracle/oradata/orcl/system01.dbf                                             6051905239995 2016 -05-05 04:14:32
             2 /u01/app/oracle/oradata/orcl/sysaux01.dbf                                             6051905239995 2016 -05-05 04:14:32
             3 /u01/app/oracle/oradata/orcl/undotbs01.dbf                                            6051905239995 2016 -05-05 04:14:32
             4 /u01/app/oracle/oradata/orcl/users01.dbf                                              6051905239995 2016 -05-05 04:14:32
             5 /u01/app/oracle/oradata/orcl/example01.dbf                                            6051905239995 2016 -05-05 04:14:32
             6 /u01/app/oracle/oradata/orcl/DEV_odi_user.dbf                                         6051905239995 2016 -05-05 04:14:32
             7 /u01/app/oracle/oradata/orcl/apex_01.dbf                                              6051905239995 2016 -05-05 04:14:32
             8 /u01/app/oracle/oradata/orcl/APEX_6121090681146232.dbf                                6051905239995 2016 -05-05 04:14:32
    8 rows selected
    

    在检查点完成之后,此检查点之前修改过的数据都已经写回磁盘,重做日志文件中的相 应重做记录对于崩溃/实例恢复不再有用。

    检查点的频度对于数据库的恢复时间具有极大的影响, 如果检查点的频率高,那么恢复时需要应用的重做日志就相对得少,恢复时间就可以缩短。 然而,需要注意的是,数据库内部操作的相关性极强,过于频繁的检查点同样会带来性能问 题,尤其是更新频繁的数据库。所以数据库的优化是一个系统工程,不能草率。

    更进一步可以知道,如果Oracle 可以在性能允许的情况下,使得检查点的SCN 逐渐逼近 Redo的最新变更,那么最终可以获得一个最佳平衡点,使得 Oracle 可以最大化的减少恢复 时间。

    为了实现这个目标,Oracle 在不同版本中一直在改进检查点的算法。

    展开全文
  • 初探Oracle--Oracle查询操作

    千次阅读 2017-03-25 12:54:06
    oracle的体系很庞大,要学习它,首先要了解oracle的框架。   1、物理结构(由控制文件、数据文件、重做日志文件、参数文件、归档文件、密码文件组成) 控制文件:包含维护和验证数据库完整性的必要信息、例如,控制...

    oracle的体系很庞大,要学习它,首先要了解oracle的框架。

     

    1、物理结构(由控制文件、数据文件、重做日志文件、参数文件、归档文件、密码文件组成)

    控制文件:包含维护和验证数据库完整性的必要信息、例如,控制文件用于识别数据文件和重做日志文件,一个数据库至少需要一个控制文件

    数据文件:存储数据的文件

    重做日志文件:含对数据库所做的更改记录,这样万一出现故障可以启用数据恢复。一个数据库至少需要两个重做日志文件

    参数文件:定义Oracle例程的特性,例如它包含调整SGA中一些内存结构大小的参数

    归档文件:是重做日志文件的脱机副本,这些副本可能对于从介质失败中进行恢复很必要。

    密码文件:认证哪些用户有权限启动和关闭Oracle例程

     

    2、逻辑结构(表空间、段、区、块)

    表空间:是数据库中的基本逻辑结构,一系列数据文件的集合。

    段:是对象在数据库中占用的空间

    区:是为数据一次性预留的一个较大的存储空间

    块:ORACLE最基本的存储单位,在建立数据库的时候指定

     

    3、内存分配(SGAPGA)

    SGA:是用于存储数据库信息的内存区,该信息为数据库进程所共享。它包含Oracle服务器的数据和控制信息,它是在Oracle服务器所驻留的计算机的实际内存中得以分配,如果实际内存不够再往虚拟内存中写。

    PGA:包含单个服务器进程或单个后台进程的数据和控制信息,与几个进程共享的SGA正相反PGA是只被一个进程使用的区域,PGA在创建进程时分配在终止进程时回收

     

    4、后台进程(数据写进程、日志写进程、系统监控、进程监控、检查点进程、归档进程、服务进程、用户进程)

    数据写进程:负责将更改的数据从数据库缓冲区高速缓存写入数据文件

    日志写进程:将重做日志缓冲区中的更改写入在线重做日志文件

    系统监控:检查数据库的一致性如有必要还会在数据库打开时启动数据库的恢复

    进程监控:负责在一个Oracle进程失败时清理资源

    检查点进程:负责在每当缓冲区高速缓存中的更改永久地记录在数据库中时,更新控制文件和数据文件中的数据库状态信息。

    归档进程:在每次日志切换时把已满的日志组进行备份或归档

    服务进程:用户进程服务。

    用户进程:在客户端,负责将用户的SQL语句传递给服务进程,并从服务器段拿回查询数据。

     

    5oracle例程:Oracle例程由SGA内存结构和用于管理数据库的后台进程组成。例程一次只能打开和使用一个数据库。

     

    6SCN(System Change Number):系统改变号,一个由系统内部维护的序列号。当系统需要更新的时候自动增加,他是系统中维持数据的一致性和顺序恢复的重要标志。


    Oracle数据库的四个主要的用户:sys,system,scott,数据用户

    以Scott下的四张表为例,(Oracle自带的),信息如下:


    EMP---员工表,SaleGrade---工资等级表,Bouns---工资表,部门表---dept

    简单查询

    基本语法如下:

    select  【distinct】* | 列名【别名】,列名2【别名】,。。。from 表名【别名】

    例如;

    查询所有员工的基本的年薪,同时查询员工的编号的姓名。

    select t.empno,t.ename,t.sal*12  a from emp  t;

    限定查询

    指在全部数据查询结果出来之前加上一些过滤条件,主要满足此过滤条件的数据都可以显示出来,而过滤条件可以设置多个,如果要设置限定条件的话,必须使用where这个关键词

    基本语法如下:

    select  【distinct】* | 列名【别名】,列名2【别名】,...from 表名【别名】 where 条件(n)
    例如:

    查询工资高于2000的全部员工信息

    select * from emp t where t.sal > 2000


    数据排序

    按照某个指定字段,将查询出来的结果进行排序

    基本语法如下:

    Select * from table where … order by 排序字段 [desc|asc]

    ·DESC : 表示的是降序排列
    ·ASC:表示的是升序排列(默认)
    例如:

    查询所有雇员,并且按照工资来升序排列

    select * from emp t order by t.sal asc;--根据工资升序排列


    单行函数

    单行函数就是完成一个子功能的小的操作函数,例如,可以进行字符串大小写转换等等,对于一个数据库而言,除了sql语句之外,那么剩下的就是要掌握单行函数,单行函数是数据库自己的功能,而且有些功能可以通过程序来进行处理,单行函数一共分为5种:字符函数、数字函数、日期函数、转换函数、通用函数。

    字符函数:字符函数的主要功能就是对字符串进行数据的处理操作,一般字符函数包含:upper()、lower()、initcap()、length()、substr()、replace()、instr()

    数字函数,主要有三个:round(),trunc(),mod()

    日期函数:

    取得当前日期:sysdate

    取得系统当前日期之后,在日期操作中,还包含了三个数学公式:

         ·日期+数字= 日期(若干天后的日期)

         ·日期-数字 = 日期(若干天前的日期)

         ·日期-日期=数字(两个日期的天数差)

    常用的四个日期操作函数:

          ·取出若干月后的日期:add_months(列|日期,增长的月份)

         ·取出两个日期之间经历的月数:months_between(列|日期,列|日期)

         ·取出一个日期所在月的最后一天:last_day(列|日期)

         ·取出下一个指定的日期:next_day(列|日期)

    转换函数:

    转换就是指可以通过函数实现这些数据类型的转换。

           ·数字或者日期转换成字符串:to_char(列|日期|数字,转换格式)

           ·字符串转换成日期:to_date(列|字符串,转换格式)

           ·字符串转换成数字:to_number(列|字符串)

    例如:

    例如查询职工姓名,编号,薪水,职位,入职日期:

    select t.ename,t.empno,t.sal,t.job,t.hiredate from emp t where t.hiredate between to_date('1981-01-01','yyyy-mm-dd')

    统计每个部门的人数,平均工资和总工资,并且显示部门名称和编号,按总工资升序排列:

    select count(e.empno),avg(e.sal),sum(e.sal) sumsal from emp e,dept d 
    where e.deptno=d.deptno group by d.deptno,d.dname order by sumsal

    列出所有员工的编号,姓名,及其直接上级的编号,姓名,工资,显示结果按照领导工资降序排列:

    select e.empno 员工编号,e.ename 员工姓名,e.mgr 员工上级编号,a.ename 上级名字,a.sal 上级收入 from emp e,emp a
     where e.mgr=a.empno(+) order by a.sal desc

    按照上级领导编号查询此领导所有下属的人数、平均工资、总工资:

    select  b.ename 员工名字,b.empno 员工编号,count(a.empno) 员工数量,
    avg(a.sal) 平均薪水,sum(a.sal) 总薪水 from emp a,emp b 
    where a.mgr = b.empno group by b.ename,b.empno order by 总薪水
    *注意:统计函数要和group by一起使用

    如何安装Oracle数据库?  http://blog.csdn.net/weixin_36380516/article/details/65935820




    展开全文
  • oracle 身份证号检查函数

    千次阅读 2017-11-15 16:43:03
    oracle 身份证号检查函数函数调用:select fn_checkidcard(‘身份证号’) as result from dual; 如果返回1,表示身份证号合法;如果为0,表示非法;函数定义:CREATE OR REPLACE FUNCTION fn_checkidcard (p_idcard...

    oracle 身份证号检查函数

    函数调用:

    select fn_checkidcard(‘身份证号’) as result from dual;
    如果返回1,表示身份证号合法;如果为0,表示非法;

    函数定义:

    CREATE OR REPLACE FUNCTION fn_checkidcard (p_idcard IN VARCHAR2) RETURN INT
    IS
       v_regstr      VARCHAR2 (2000);
       v_sum         NUMBER;
       v_mod         NUMBER;
       v_checkcode   CHAR (11)       := '10X98765432';
       v_checkbit    CHAR (1);
       v_areacode    VARCHAR2 (2000) := '11,12,13,14,15,21,22,23,31,32,33,34,35,36,37,41,42,43,44,45,46,50,51,52,53,54,61,62,63,64,65,71,81,82,91,';
    BEGIN
       CASE LENGTHB (p_idcard)
          WHEN 15
          THEN                                                            -- 15IF INSTRB (v_areacode, SUBSTR (p_idcard, 1, 2) || ',') = 0 THEN
                RETURN 0;
             END IF;
    
             IF MOD (TO_NUMBER (SUBSTRB (p_idcard, 7, 2)) + 1900, 400) = 0
                OR
                (
                    MOD (TO_NUMBER (SUBSTRB (p_idcard, 7, 2)) + 1900, 100) <> 0
                    AND
                    MOD (TO_NUMBER (SUBSTRB (p_idcard, 7, 2)) + 1900, 4) = 0
                )
             THEN                                                          -- 闰年
                v_regstr :=
                   '^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}$';
             ELSE
                v_regstr :=
                   '^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}$';
             END IF;
    
             IF REGEXP_LIKE (p_idcard, v_regstr) THEN
                RETURN 1;
             ELSE
                RETURN 0;
             END IF;
          WHEN 18
          THEN                                                             -- 18位
             IF INSTRB (v_areacode, SUBSTRB (p_idcard, 1, 2) || ',') = 0 THEN
                RETURN 0;
             END IF;
    
             IF MOD (TO_NUMBER (SUBSTRB (p_idcard, 7, 4)), 400) = 0
                OR
                (
                    MOD (TO_NUMBER (SUBSTRB (p_idcard, 7, 4)), 100) <> 0
                    AND
                    MOD (TO_NUMBER (SUBSTRB (p_idcard, 7, 4)), 4) = 0
                )
             THEN                                                          -- 闰年
                v_regstr :=
                   '^[1-9][0-9]{5}(19|20)[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}[0-9Xx]$';
             ELSE
                v_regstr :=
                   '^[1-9][0-9]{5}(19|20)[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}[0-9Xx]$';
             END IF;
    
             IF REGEXP_LIKE (p_idcard, v_regstr) THEN
                v_sum :=
                       (  TO_NUMBER (SUBSTRB (p_idcard, 1, 1))
                        + TO_NUMBER (SUBSTRB (p_idcard, 11, 1))
                       )
                     * 7
                   +   (  TO_NUMBER (SUBSTRB (p_idcard, 2, 1))
                        + TO_NUMBER (SUBSTRB (p_idcard, 12, 1))
                       )
                     * 9
                   +   (  TO_NUMBER (SUBSTRB (p_idcard, 3, 1))
                        + TO_NUMBER (SUBSTRB (p_idcard, 13, 1))
                       )
                     * 10
                   +   (  TO_NUMBER (SUBSTRB (p_idcard, 4, 1))
                        + TO_NUMBER (SUBSTRB (p_idcard, 14, 1))
                       )
                     * 5
                   +   (  TO_NUMBER (SUBSTRB (p_idcard, 5, 1))
                        + TO_NUMBER (SUBSTRB (p_idcard, 15, 1))
                       )
                     * 8
                   +   (  TO_NUMBER (SUBSTRB (p_idcard, 6, 1))
                        + TO_NUMBER (SUBSTRB (p_idcard, 16, 1))
                       )
                     * 4
                   +   (  TO_NUMBER (SUBSTRB (p_idcard, 7, 1))
                        + TO_NUMBER (SUBSTRB (p_idcard, 17, 1))
                       )
                     * 2
                   + TO_NUMBER (SUBSTRB (p_idcard, 8, 1)) * 1
                   + TO_NUMBER (SUBSTRB (p_idcard, 9, 1)) * 6
                   + TO_NUMBER (SUBSTRB (p_idcard, 10, 1)) * 3;
                v_mod := MOD (v_sum, 11);
                v_checkbit := SUBSTRB (v_checkcode, v_mod + 1, 1);
    
                IF v_checkbit = upper(substrb(p_idcard,18,1)) THEN
                   RETURN 1;
                ELSE
                   RETURN 0;
                END IF;
             ELSE
                RETURN 0;
             END IF;
          ELSE
             RETURN 0;                                      -- 身份证号码位数不对
       END CASE;
    EXCEPTION
       WHEN OTHERS
       THEN
          RETURN 0;
    END fn_checkidcard;
    
    展开全文
  • oracle完全检查点和增量检查点详解

    万次阅读 2012-07-30 14:00:23
    由于Oracle中LGWR和DBWR工作的不一致,Oracle引入了检查点的概念,用于同步数据库,保证数据库的一致性。...完全检查点会将数据缓冲区里面所有的脏数据块写入相应的数据文件中,同时将最新的checkpoint scn更新到所
  • Oracle 查询技巧与优化(二) 多表查询

    万次阅读 多人点赞 2016-08-05 08:59:59
    关于Oracle多表查询的一些技巧和优化~
  • oracle dg 状态检查

    万次阅读 2018-04-30 16:51:11
    检查备库的归档日志同步情况 SELECT NAME,applied FROM v$archived_log; alter database recover managed standby database cancel;select thread#,sequence#,standby_dest,archived,applied,status from v$...
  • Oracle rac 状态检查

    千次阅读 2010-08-18 13:25:00
    (1)srvctl status database -d dbservername oracle@zjgldb2$srvctl status database -d kms 实例 kms1 正在节点 zjgldb1 上运行 实例 kms2 正在节点 zjgldb2 上运行     (2)...
  • 监控:Oracle一些状态 --DB查询状态(数据库实例的运行状态)   select d.dbid,d.name,d.open_mode,d.database_role,i.instance_name,i.status from v$database d, v$instance i; --DB连接状态(监听状态)   ...
  • oracle查询语句大全 oracle 基本命令大全 Oracle命令(一):Oracle登录命令 1、运行SQLPLUS工具  C:\Users\wd-pc>sqlplus 2、直接进入SQLPLUS命令提示符  C:\Users\wd-pc>sqlplus /nolog 3、以OS身份...
  • oracle 查询执行顺序

    万次阅读 2011-09-22 21:27:40
    oracle 语句提高查询效率的方法 1:.. where column in(select * from ... where ...); 2:...... ...第二种格式要远比第一种...在Oracle中可以几乎将所有的IN操作符子查询改写为使用EXISTS的子查询 使用EXISTS,Orac
  • ORACLE-检查约束(check)

    千次阅读 2019-03-27 15:38:26
    ORACLE-检查约束(check) 1.检查约束 ( check )  某列取值范围限制、格式限制等 2.检查只能是男或者女 create table test29( id number primary key, sex varchar2(2) check(sex in (‘男,女’)) ); create table...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 250,169
精华内容 100,067
关键字:

oracle查询所有检查