PostgreSQL 模式介绍_postgresql public

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

在指定模式里创建表,如:

CREATE TABLE myschema.mytable (
...
);
修改模式
ALTER SCHEMA name RENAME TO new\_name;
ALTER SCHEMA name OWNER TO new\_owner;

ALTER SCHEMA修改一个模式的定义。

要使用ALTER SCHEMA,你必须是该模式的所有者。 要给一个模式重命名,你必须在该数据库上有CREATE权限。 要修改所有者,你还必须是新的所有角色的直接或间接成员, 并且该成员必须在此数据库上有CREATE权限。 (超级用户自动拥有全部权限。)

删除模式
DROP SCHEMA [ IF EXISTS ] name [, ...] [ CASCADE | RESTRICT ]
//DROP SCHEMA从数据库中删除模式。

模式只能被它的所有者或者超级用户删除。请注意, 所有者即使没有拥有模式中任何对象也可以删除模式(以及模式中的所有对象)。

参数
CASCADE:自动删除包含在模式中的对象(表、函数等等)。
RESTRICT:如果模式包含任何对象,则拒绝删除它。这个是缺省。

公共模式

要创建或者访问模式中的对象,需要先写一个受修饰的名字,这个名字包含模式名和表名,它们之间用一个“点”分开,如下:

schema\_name.table_name;

通常情况下,创建和访问表的时候都不用指定模式,实际上这时访问的都是“public”模式。每当我们创建一个新的数据库时,postgresql都会自动创建一个名为“public”的模式。当登录到该数据库时,如果没有特殊的指定,都是以该模式操作各种数据对象的。如:

CREATE TABLE products ( ... ); 
等同于
CREATE TABLE public.products ( ... );
模式搜索路径

全称的名字写起来非常费劲,并且我们最好不要在应用里直接写上特定的模式名。因此,表通常都是用未修饰的名字引用的,这样的名字里只有表名字。系统通过查找一个搜索路径来判断一个表究竟是哪个表,这个路径是一个需要查找的模式列表。 在搜索路径里找到的第一个表将被当作选定的表。如果在搜索路径中没有匹配表,那么就报告一个错误,即使匹配表的名字在数据库其它的模式中存在也如此。

在搜索路径中的第一个模式叫做当前模式。除了是搜索的第一个模式之外, 它还是在 CREATE TABLE 没有声明模式名的时候,新建表所在的地方。

查看当前搜索路径,使用命令:

SHOW search\_path;

在缺省的设置中,返回下面的东西:

 search\_path
--------------
 $user,public

结果显示的是search_path的默认设置,从这个默认设置可以看到“public”模式总是在搜索路径中。所以一般情况下,若创建的表默认没有指定模式,那都会在“public”模式下。

同时,结果显示第一个元素声明将要搜索一个和当前用户同名的模式。 因为还没有这样的模式存在,所以这条记录被忽略。第二个元素指向public模式。

要把新的模式放到路径中来,我们用

SET search\_path TO myschema,public;
模式的权限

缺省时,用户看不到模式中不属于他们所有的对象。为了让他们看得见,模式的所有者需要在模式上赋予 USAGE 权限。为了让用户使用模式中的对象,我们可能需要赋予额外的权限, 只要是适合该对象的。

用户也可以允许在别人的模式里创建对象。要允许这么做, 我们需要赋予在该模式上的 CREATE 权限。 请注意,缺省时,每个人都在 public 模式上 有 CREATE 权限。这样就允许所有可以连接到指定数据库上的用户在这里创建对象。如果你不允许这么做, 你可以撤销这个权限:

REVOKE CREATE ON public FROM PUBLIC;

(第一个 “public” 是模式,第二个 “public” 意思是”所有用户”。 第一句里它是个标识符,而第二句里是个关键字,所以有不同的大小写)。
在收回权限后,其他用户就不能在模式“public”下创建对象了。

在为模式下的所有表赋予权限时,需要将权限拆分为各种不同的表操作,如:

ALTER DEFAULT PRIVILEGES IN SCHEMA myschema
 GRANT INSERT, SELECT, UPDATE, DELETE, TRUNCATE, REFERENCES, TRIGGER ON TABLES TO public;

在为模式下的所有函数赋予权限时,仅考虑执行权限,如:

ALTER DEFAULT PRIVILEGES IN SCHEMA myschema
 GRANT EXECUTE ON FUNCTIONS TO public;

撤销模式权限可以这么做

REVOKE [CREATE...] ON SCHEMA public FROM PUBLIC;

可以看出,通过以上方式在public模式下为myschema模式创建各种对象是极为不方便的。下面我们将要介绍另外一种方式,即通过role对象,直接登录并关联到myschema对象,之后便可以在myschema模式下直接创建各种所需的对象了。

--创建了和该模式关联的角色对象。
CREATE ROLE myschema LOGIN PASSWORD '123456'; 
--将该模式关联到指定的角色,模式名和角色名可以不相等。
CREATE SCHEMA myschema AUTHORIZATION myschema; 

在Linux Shell下,以myschema的角色登录到数据库MyTest,在密码输入正确后将成功登录到该数据库。

/> psql -d MyTest -U myschema
Password:
MyTest=> CREATE TABLE test(i integer);
CREATE TABLE
MyTest=> \d   --查看该模式下,以及该模式有权限看到的tables信息列表。
 List of relations
 Schema | Name | Type | Owner
------------+---------+------+----------


![img](https://img-blog.csdnimg.cn/img_convert/5fe338960d3b386b9494fe66a040df04.png)
![img](https://img-blog.csdnimg.cn/img_convert/4662732f776122fc997a57bc9882ce5e.png)
![img](https://img-blog.csdnimg.cn/img_convert/343a144b2c45fb44a46f880081f391e2.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上软件测试知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[需要这份系统化的资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618631832)**

有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上软件测试知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[需要这份系统化的资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618631832)**

### PostgreSQL Public Schema Usage and Management In the context of PostgreSQL, schemas organize database objects such as tables, indexes, views, etc., within a logical namespace. The `public` schema is created by default when a new database is initialized and serves as the standard location where unqualified object names are placed or searched. To list all available relations including tables under the `public` schema, one can use the `\d` command inside psql which shows information about named relation (table, index, sequence, view)[^2]. For more detailed inspection on specific types like only showing tables, users may opt to execute: ```sql \dt public.* ``` This command lists all tables explicitly from the `public` schema ensuring clarity over what structures exist there specifically. For managing data caching performance related to these objects in the `public` schema—or any other part of the database—the configuration parameter `shared_buffers`, specifying how much memory should be allocated for this purpose, plays an important role; it defaults to 128MB but might need adjustment based on actual workload requirements[^3]. When working with the `public` schema directly through SQL commands rather than meta-commands provided by psql, always qualify identifiers unless certain that no naming conflicts will arise between different schemas due to search_path settings affecting visibility rules implicitly applied during query execution. --related questions-- 1. How does altering shared_buffers impact overall system performance? 2. What methods exist for changing the current session's schema path dynamically without modifying global configurations permanently? 3. Can you provide examples demonstrating creation and manipulation of custom schemas alongside using the public schema effectively? 4. In scenarios involving multiple schemas, how do permissions differ across them compared to those set up within the public schema exclusively?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值