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。
2、disc命令
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;
已连接。
4、exit命令
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
已创建 1 行。
看这意思 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)
*
第 1 行出现错误:
ORA-00984: 列在此处不允许
SQL> insert into goods_tb values(3,'qiaokeli',30,'shipin','letben');
已创建 1 行。
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
*
第 1 行出现错误:
ORA-00988: 口令缺失或无效
新创建的用户并不具有,链接数据库的权限。
SQL> create user lifei identified by lifei;
create user lifei identified by lifei
*
第 1 行出现错误:
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');
已创建 1 行。
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
*
第 1 行出现错误:
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
*
第 1 行出现错误:
ORA-01951: ROLE 'CONNECT' 未授予 'SYSTEM'
事实证明 系统管理员的 开门的权限是 无法被剥夺的。
1拥有表,1把权限给了2 with grant option。2把权限给了3with grant option。当1收回2的权限时,3 也不再可以查看 1的表了。
这个里面有知识点: 对于 大门的权限 可以传递 收回了,传递出去的依然具有权限。但是 对于查看表的权限,依然可以传递,但是 一旦从一个 人那里收回了,传递出去的人也不再 不可以 查看了。