oracle数据库入门

时间:2021-10-08 12:23:57

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数据库入门

 

 

 

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

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

oracle数据库入门

 

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

 oracle数据库入门

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 命令就直接退出了,好在 需要记录的内容都被记录了。

 oracle数据库入门

 

这里如果 刚刚最终修改的结果是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的表了。

 

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