Skip to content

Commit

Permalink
模式权限
Browse files Browse the repository at this point in the history
  • Loading branch information
fengzhao committed Oct 24, 2024
1 parent 0c62a5a commit a649dfd
Showing 1 changed file with 59 additions and 0 deletions.
59 changes: 59 additions & 0 deletions docs/basic/4.sql.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,31 @@
- 数据库(database):存放多个相关业务数据表的逻辑对象。
- 模式(schema):MySQL 中 schema 等同于 database。



在数据库管理系统中,Schema是指数据库的结构和组织方式的描述,它定义了如何存储和组织数据,以及数据之间的关系和约束。简单来说,Schema是数据库的蓝图,它决定了数据库中有哪些表、每个表有哪些字段以及它们之间的关系。

根据 `SQL` 标准定义,SCHEMA(模式) 是一个描述符的持久命名集合(a persistent, named collection of descriptors),SCHEMA 中通常包含了表、列、数据类型、视图、存储过程、关系、主键和外键等对象。


SCHEMA和DATABASE是否等同?

涉及到数据库的模式有很多疑惑,问题经常出现在模式和数据库之间是否有区别,如果有,区别在哪里。

==取决于数据库厂商,对schema(模式)产生疑惑的一部分原因是不同的数据库厂商系统倾向于以自己的方式处理模式。==



造成疑惑的另一个原因可能是由于schema这一术语具有如此广泛的含义,因为它在不同的环境下有不同的含义,schema一词源于希腊语skhēma,意思是形态(form),轮廓(figure),形状(shape)或方案(plan)。

Schema在心理学中被用来描述组织信息类别及其之间关系的有组织的思维或行为模式。

我们在设计一个数据库之前,还需要看看数据中的信息种类和它们之间的关系,在我们开始使用DBMS中的物理模式之前,我们需要创建一个概念模式。

在软件开发中讨论模式时,可以讨论概念模式、物理模式、内部模式、外部模式、逻辑模式等,每一个都有其特定的含义。



可以在[MySQL 术语表](https://dev.mysql.com/doc/refman/8.0/en/glossary.html)中查到上面这些定义。

在关系型数据库术语中,模式(schema)是一个逻辑概念,通常被看作是一个数据库对象的集合,用于组织数据库中的对象。
Expand All @@ -26,6 +51,40 @@

数据库一词,在不同的上下文有不同的含义,因为它可以是数据库产品、数据库服务(系统)、数据库实例、数据库进程其中之一,而这些名词所表示的是不同的事物。


==在 MySQL 中,用户和模式(或者说数据库)没有任何直接关系==。它们之间的权限访问关联是可以多对多来实现。(一个用户可以访问多个模式中的多个对象。一个模式也可以被多个用户访问)。也可以很简单的跨用户赋权。A用户想访问(DDL/DML)db_test模式中的某些对象(表,视图等)



Oracle 中的SCHEMA与DATABASE之间的关系

Oracle中的SCHEMA与其他数据库系统大不相同,它与数据库用户密切相关。Oracle官方文档指出,SCHEMA是数据或模式对象的逻辑结构的集合,由数据库用户拥有,并且与该用户具有相同的名称,也就是说每个用户拥有一个独立的SCHEMA。

Oracle数据库中Schema和User的关系是一一对应的,也就是说一个Schema只对应一个User,一个User对应一个Schema。当某个User下面有table,view,Index......等Schema Object时,这个User就成了一个Schema。Schema 是指一个用户所拥有的数据库对象的集合,用于权限管理和命名空间隔离,我个人把他理解成一个"用户空间"。"Schema 对象"是指在某个 Schema 中的数据库对象,例如 Schema 中的表、视图、索引等;非 Schema 对象是指不属于某个 Schema 的数据库对象,例如用户、角色、表空间等。

==Oracle其实并不支持单独CREATE SCHEMA这种语句的==

同时,这种赋权还是很麻烦的。要允许用户 A 对用户 B 的对象(如表)进行操作,用户 A 必须具有相应的权限。用户 B 需要授予用户 A 这些权限。

```SQL
-- 用户 B 授予用户 A 对表 table_name 的 SELECT 权限
GRANT SELECT ON userB.table_name TO userA;

-- 用户 B 授予用户 A 对表 table_name 的 INSERT 和 UPDATE 权限
GRANT INSERT, UPDATE ON userB.table_name TO userA;



-- 用户 B 授予用户 A 对其所有表的 SELECT 权限
BEGIN
FOR rec IN (SELECT table_name FROM all_tables WHERE owner = 'USERB') LOOP
EXECUTE IMMEDIATE 'GRANT SELECT ON userB.' || rec.table_name || ' TO userA';
END LOOP;
END;
```



**数据库产品**

是指由各数据库厂商提供的产品或服务,如 oracle、mysql、postges,以及各云厂商提供的各种云数据库服务,需要付费或者下载才能得到的物件,此为软件,类似于商品。当拿到数据库产品时,拿到的是一份数据库产品的软件拷贝;而购买在线云数据库服务时,得到的是云数据库的使用权限。
Expand Down

0 comments on commit a649dfd

Please sign in to comment.