zoukankan      html  css  js  c++  java
  • oracle数据库入门

    oracle  数据库入门。

     

    1、数据

    2、数据存储的地方:变量 数组 容器 (内存中),文件,数据库(文件)

    3、数据库系统:sqlserver 2000   2005  2008  mysql 5.5 oracle 9i 10g 11g db2

    4、oracle 数据

    5、oracle 数据库不同于其他的数据库,一个数据库下面有好多用户:

    用户模式:sys system scott  默认用户

     

     

    老师这里认为 实例等价于数据库、用户等价于模式、表空间

    oracle 里面 一个 实例 就对应一个 数据库。 用户 等价于 开启一种特定对应的模式,比如普通权限的用户或者 超级管理员 等等等。

     

    好吧 还是 看那个 ppt  吧,实例指的是:数据库服务器的内存与相关处理程序。

     

     

     

     

    吼吼吼!这个 ORACLE SQL*Plus 是默认自带安装的。

    当 当前表中没有数据的时候,返回的结果是:

     

    如果是使用PL/SQL Developer 的话,返回的结果是:

     

    Sys权限最高是超级用户。具有最高权限。拥有sysdba角色。特色在于拥有create database也就是创建数据库的权限。

    System是用户管理员。具有很大的权限,没有创建创建数据库的权限,除此之外权限相同。

    其他的今本上都是普通用户了。

     

    1、连接 conn 语法:

     

    SQL> conn system/lifei23

    已连接。

    SQL> conn sys/lifei23

    ERROR:

    ORA-28009: connection as SYS should be as SYSDBA or SYSOPER

     

    警告您不再连接到 ORACLE

    SQL> show user;

    USER 为 ""

    SQL> 

     

    一旦用户名密码输入错误,则与oracle的连接断开,所以此时不再能连接到数据库,再次展示用户,用户为空。

    可见每次执行 conn 命令时,是先退出当前用户,随即登录最新的用户,如果用户名密码正确允许登录,如果错误则失去连接(因为之前登录用户已经退出)。

    SQL> conn system/lifei23

    已连接。

    SQL> conn sys/lifei23

    ERROR:

    ORA-28009: connection as SYS should be as SYSDBA or SYSOPER

     

    警告您不再连接到 ORACLE

    SQL> show user;

    USER 为 ""

    SQL> conn lifei/lifei

    ERROR:

    ORA-01017: invalid username/password; logon denied

    警告您不再连接到 ORACLE

     

    可是两种登录失败,是有本质上差距的。不知道 那个 系统用户如何才能登录成功,至少现在不知道。

     

     

    警告您不再连接到 ORACLE

     

    2disc命令

    SQL> disc

    SQL> show user;

    USER 为 ""

    SQL> conn scott/lifei23;

    已连接。

    SQL> disc

    从 Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - Production

    With the Partitioning, OLAP and Data Mining options 断开

    SQL> 

     

    登录当前用户,然后退出。

     

     

    3、更改密码:  password 命令

     

    SQL> conn scott/lifei23

    已连接。

    SQL> show user;

    USER 为 "SCOTT"

    SQL> password

    更改 SCOTT 的口令

    旧口令: *******

    新口令:******

    重新键入新口令:******

    口令已更改

    SQL> conn scott/123456

    已连接。

    这个 是当前用户 修改自己的密码,所以需要原来的密码。

     

    下面利用管理员权限修改密码,这个时候相当于要求管理员修改密码,那么管理员是可以不记得某个具体用的密码的,所以当管理员在修改密码的时候,是不需要原来的密码的。

    SQL> conn system/lifei23

    已连接。

    SQL> password scott

    更改 scott 的口令

    新口令:*******

    重新键入新口令:*******

    口令已更改

    SQL> conn scott/lifei23;

    已连接。

     

    4exit命令

    exit 命令就直接退出了,好在 需要记录的内容都被记录了。

     

     

    这里如果 刚刚最终修改的结果是lifei23 那么一切安全,要不登录都登陆不上去了。。。

     

    5、导入命令 start 或者 @

     

    SQL> start f:/test/chaoshen.sql

     

    未选定行

     

    那应该是写对了在 f:/test 目录下新建了一个 文件 叫做 chaoshen.sql 里面有一句话:

    Select * from goods_tb;按照之前的结果 如果 表中没有结果 那么返回的结果就是:未选定行。

     

    这个 利用也可以实现。就是 在这里面start 和 是等效的。

    然后有一个 edit 命令 可以用来修改 这个 文件,要加全路径。

    然后再次执行看看什么效果:

     

    未选定行

     

    6、编辑命令  edit

     

    SQL> edit f:/test/chaoshen.sql

     

    SQL> @ f:/test/chaoshen.sql

     

    已创建 行。

     

    看这意思 insert 语句 是对的。

     

    嘿嘿

     

     

    SQL> edit f:/test/chaoshen.sql

     

    SQL> start f:/test/chaoshen.sql

     

    GOODS_ID GOODS_NAME                     GOODS_PRICE GOODS_CA

    -------- ------------------------------ ----------- --------

    GOODS_PROVIDER

    ------------------------------

    1        shangpin1                               50 weijin

    33

     

     

    SQL> show linesize

    linesize 80

    SQL> set linesize 120

    SQL> show linesize

    linesize 120

    SQL> @ f:/test/chaoshen.sql

     

    GOODS_ID GOODS_NAME                     GOODS_PRICE GOODS_CA GOODS_PROVIDER

    -------- ------------------------------ ----------- -------- ------------------------------

    1        shangpin1                               50 weijin   33

     

     

    SQL> alter table goods_tb modify(goods_name varchar2(10));

     

    表已更改。

     

    SQL> select * from goods_tb

      2  

    SQL> select * from goods_tb;

     

    GOODS_ID GOODS_NAME GOODS_PRICE GOODS_CA GOODS_PROVIDER

    -------- ---------- ----------- -------- -----------------

    1        shangpin1           50 weijin   33

     

    嘿嘿,这样就很好看了。

     

    最起码很整齐。

     

    SQL> select * from goods_tb;

     

    GOODS_ID GOODS_NAME GOODS_PRICE GOODS_CA GOODS_PROVIDER

    -------- ---------- ----------- -------- ----------------------------

    1        shangpin1           50 weijin   33

    2        weijin              35 yongpin  33

     

     

    7、导出命令:spool 【会覆盖更新】

    SQL> spool f:/test/record.txt

    SQL> insert into goods_tb values(3,'qiaokeli',30,'shipin',letben)

      2  

    SQL> insert into goods_tb values(3,'qiaokeli',30,'shipin',letben);

    insert into goods_tb values(3,'qiaokeli',30,'shipin',letben)

                                                         *

    第 行出现错误:

    ORA-00984: 列在此处不允许

     

     

    SQL> insert into goods_tb values(3,'qiaokeli',30,'shipin','letben');

     

    已创建 行。

     

    SQL> spool end;

     

    然后就可以 到上面加黑字体路径下面找到那个 文件,发现这样一些内容。

     

    linesize 好像刚刚我们试验过。

     

    SQL> spool f:/test/record.txt

    SQL> select * from goods_tb;

     

    GOODS_ID GOODS_NAME GOODS_PRICE GOODS_CA GOODS_PROVIDER

    -------- ---------- ----------- -------- --------------

    1        shangpin1           50 weijin   33

    2        weijin              35 yongpin  33

    3        qiaokeli            30 shipin   letben

     

    SQL> spool off;

    发现spool off 具有 跟 end 一样的效果。

    然后 如果 文件名相同的话,之前的内容会被覆盖更新。也就是 不复存在。所以 在创建时,要留心,判定一下是否要 执行覆盖操作。

     

    Show linesize 展示每行展示多少列 默认80列 也就是80个字符。

    可以利用  :Set linesize   120;  命令 修改 列长

    Show pagesize  展示每页显示多少行,默认 14行。

    可以 利用 set pagesize 30

    在 Oracle SQL*Plus  这个界面里面,  pagesize 为 1或者 2的时候,显示效果是相同的,都是只有 那单独的一行查询结果:

     

    当设置pagesize 为 3的时候 ,才能显示齐全的效果。

    SQL> set pagesize 2;

    SQL> select * from goods_tb;

     

    1        shangpin1           50 weijin   33

     

    2        weijin              35 yongpin  33

     

    3        qiaokeli            30 shipin   letben

     

    SQL> set pagesize 3;

    SQL> select * from goods_tb;

     

    GOODS_ID GOODS_NAME GOODS_PRICE GOODS_CA GOODS_PROVIDER

    -------- ---------- ----------- -------- ---------------

    1        shangpin1           50 weijin   33

     

    GOODS_ID GOODS_NAME GOODS_PRICE GOODS_CA GOODS_PROVIDER

    -------- ---------- ----------- -------- ---------------

    2        weijin              35 yongpin  33

     

    GOODS_ID GOODS_NAME GOODS_PRICE GOODS_CA GOODS_PROVIDER

    -------- ---------- ----------- -------- ---------------

    3        qiaokeli            30 shipin   letben

     

    SQL> set pagesize 1;

    SQL> select * from goods_tb;

     

    1        shangpin1           50 weijin   33

     

    2        weijin              35 yongpin  33

     

    3        qiaokeli            30 shipin   letben

    8、 Create 命令  创建用户命令

    创建用户 必须要给出密码,如果不给,是不允许创建的

    SQL> create user lifei identified by 111;

    create user lifei identified by 111

                                    *

    第 行出现错误:

    ORA-00988: 口令缺失或无效

     

    新创建的用户并不具有,链接数据库的权限。

     

    SQL> create user lifei identified by lifei;

    create user lifei identified by lifei

                                    *

    第 行出现错误:

    ORA-01031: 权限不足

     

    SQL> conn system/lifei23;

    已连接。

    SQL> create user lifei identified by lifei;

     

    用户已创建。

     

    SQL> conn lifei/lifei;

    ERROR:

    ORA-01045: user LIFEI lacks CREATE SESSION privilege; logon denied

     

     

     

    警告您不再连接到 ORACLE

     

    在可视化界面上是可以看到这样一个 用户的存在的。但是由于没有权限的缘故 并不能够登录。

     

    所以 要先 drop 掉 这个 用户 然后 在增加,一个 用户。

    9、删除一个 用户。Drop user  userName

    SQL> conn system/lifei23;

    已连接。

    SQL> show user;

    USER 为 "SYSTEM"

    SQL> drop user lifei;

     

    用户已删除。

     

    创建用户并且 修改密码,这里面的修改 也只能 跟当时创建一样,不能用数字开头。

    SQL> show user;

    USER 为 "SYSTEM"

    SQL> create user lifei identified by lifei;

     

    用户已创建。

     

    SQL> alter user lifei identified by letben;

     

    用户已更改。

     

    【实例是数据库服务器内存和相关处理程序】

     

    有三个 可以 赋给 用户的权限 connect  dba 和 resource  

    Connect:分别代表获得链接的权限允许当前用户可以登录上这个   数据库文件编辑系统。

    dba 最高权限

    Resource 资源  数据库的 增删改查权限。

    所以按照 权限大小进行划分是:

    Connect 只连接

    Resource 增删改查

    Dba最高权限 新建数据库。

     

     

    10、授权

    可是 不级联的话,表 哪去了?

    数据库下面有很多人,人的下面有很多表。如果删了人,那  表怎么办?

     

    SQL> conn system/lifei23;

    已连接。

    SQL> create user lifei1 identified by lifei1;

     

    用户已创建。

     

    SQL> grant resource to lifei1;

     

    授权成功。

     

    SQL> connect lifei1/lifei1;

    ERROR:

    ORA-01045: user LIFEI1 lacks CREATE SESSION privilege; logon denied

     

     

    警告您不再连接到 ORACLE

     

    新建用户之后,不过 不赋权限 连登陆都登录不上去。。。

     

    如果 用户身上本身就是有表的,此时删除该用户时 不指定 cascade的话 还不可以删除。由于这个表的缘故。

     

    想了一个这样的事情,创建lifei1 创建 表,插入 元组,赋给 lifei2查询权限,然后连带删除lifei1,然后再次 创建lifei1和 表,并插入元组,此时再次利用lifei2查询 并不能查询到结果。虽然同名同姓,却  已物是人非。

     

    11、Revoke 召回权限

     

    Revoke resource from lifei1

     

    如果用户缺少session的话 需要 赋 一个 connect 的权限。

     

    Session 是与数据库沟通的权限。也就是connect

    SQL> conn lifei1;

    输入口令: ******

    ERROR:

    ORA-01045: user LIFEI1 lacks CREATE SESSION privilege; logon denied

     

     

    警告您不再连接到 ORACLE

    SQL> conn system/lifei23;

    已连接。

    SQL> grant connect to lifei1;

     

    授权成功。

     

    SQL> conn lifei1/lifei1;

    已连接。

     

    好像后面插入的数据还在上面儿呢~

    赋予 单独的某个权限。比如 增加。那修改 删除,都是这样的。

    SQL> show user;

    USER 为 "LIFEI2" 

    SQL> conn lifei1/lifei1;

    已连接。

    SQL> grant insert on test_tb to lifei2;

     

    授权成功。

     

    SQL> conn lifei2/lifei2;

    已连接。

    SQL> insert into lifei1.test_tb values(2,'ss');

     

    已创建 行。

     

    SQL> select * from lifei1.test_tb;

     

       TEST_ID TEST_NAME

    ---------- --------------------

             2 ss

             1 letben

     

    关于表的具体查询要一个 一个赋值,也可一起赋值 利用 all这个 词。

    SQL> conn lifei1/lifei1;

    已连接。

    SQL> grant all on test_tb to lifei2;

     

    授权成功。

     

    赋予所有的功能给lifei2.

     

    连接的权限传递。

     

    关于 这个 连接的权限 就是 拿钥匙开门的例子。很恰当。

     

    传递就是:记得在赋权限之余 就是 with admin option

     

    系统管理员可以直接取消这个 传递出去的权限。

     

    然后 对于单个 表上的权限来说的话,传递出去 就是 with grant option

    实验。Resource 和 connect 和 create session

     

    给权限的时候 没有都给 但是撤销的 时候 可以 revoke all on test_tb from lifei2.

     

    给大门权限包括 resource和 connect 和 create session 是 with admin option

     

    给表权限 是 with grant option

    表权限 作为 管理员 貌似 都撤销不了 但是拥有 表的人 可以 删除。

     

    问题来了:

    如果 管理员给了 lifei1 和 lifei2 两个人 开大门的权限 两个 人 可以 互相删除么?

     

    可以 谁先下手谁牛逼。

    SQL> revoke create session from system;

    revoke create session from system

    *

    第 行出现错误:

    ORA-01952: 系统权限未授予 'SYSTEM'

     

     

    SQL> show user;

    USER 为 "LIFEI1"

    SQL> conn system/lifei23;

    已连接。

    SQL> grant connect  to lifei1;

     

    授权成功。

     

    SQL> revoke connect from lifei1;

     

    撤销成功。

     

    SQL> grant connect to lifei1 with admin option;

     

    授权成功。

     

    SQL> conn lifei1/lifei1;

    已连接。

    SQL> revoke connect from system

      2  

    SQL> revoke connect from system;

    revoke connect from system

    *

    第 行出现错误:

    ORA-01951: ROLE 'CONNECT' 未授予 'SYSTEM'

     

    事实证明  系统管理员的 开门的权限是 无法被剥夺的。

     

    1拥有表,1把权限给了2 with grant option2把权限给了3with grant option。当1收回2的权限时,也不再可以查看   1的表了。

     

    这个里面有知识点: 对于 大门的权限 可以传递 收回了,传递出去的依然具有权限。但是 对于查看表的权限,依然可以传递,但是 一旦从一个 人那里收回了,传递出去的人也不再 不可以 查看了。

  • 相关阅读:
    TCP/IP资料整理
    对谷歌自带闹钟应用中材料设计的吹毛求疵
    如何给非AppCompatActivity添加Toolbar?--关于5.0新特性兼容5.0以下设备的探索
    Android 5.0自定义动画
    Android开发Tips-1
    Android控件RecyclerView与ListView的异同
    有关Android存储的相关概念辨析
    关于RecyclerView中Viewholder和View的缓存机制的探究
    Android Wear和二维码
    构建具有深度和灵活性的安卓Wear应用
  • 原文地址:https://www.cnblogs.com/letben/p/5185895.html
Copyright © 2011-2022 走看看