diff --git "a/docs/postgresql/01.postgresql\347\256\200\344\273\213.md" "b/docs/postgresql/01.postgresql\347\256\200\344\273\213.md" index 96ca2c442..7fec4e4bb 100644 --- "a/docs/postgresql/01.postgresql\347\256\200\344\273\213.md" +++ "b/docs/postgresql/01.postgresql\347\256\200\344\273\213.md" @@ -11,11 +11,13 @@ PostgreSQL 是一款高级的企业级开源关系数据库,支持 SQL(关 PostgreSQL 可用作很多 Web、移动、地理空间和分析应用程序的主要数据存储或数据仓库。**目前广为使用的版本为 PostgreSQL 12,最新的的版本已经发到PostgreSQL 15。** -PostgreSQL(简称 PG)是世界领先的开源数据库,起源于20 世纪70 年代美国加州伯克利大学,创始人是荣获图灵奖的 Michael Stonebraker。PG遵循BSD 开源协议,可以无偿获得源代码,并能根据自己的需要定制修改,可自主选择是否开放修改后的程序代码。 +PostgreSQL(简称 PG)是世界领先的开源数据库,起源于20 世纪70 年代美国加州伯克利大学,创始人是荣获图灵奖的 Michael Stonebraker。 - PG 是强大的企业级数据库,特别适合在大型企业数据管理中运用。作为一种企业级数据库,PG 具有的各种高级功能,像多版本并发控制(MVCC)、按时间点恢复(PITR)、表空间、异步复制、嵌套事务、在线热备、复杂查询的规划和优化以及为容错而进行的预写日志等。PG 支持国际字符集、多字节编码并支持使用当地语言进行排序、大小写处理和格式化等操作。同时PG 也在所能管理的大数据量和所允许的大用户量并发访问时间具有完全的高伸缩性。 +它的源代码基于 PostgreSQL 许可发行,这是一个类似于 BSD 或者 MIT 的自由开放源码许可协议。用户可以基于任何目的使用、修改和发布 PostgreSQL,甚至直接包装一下拿出去卖钱都没问题,唯一的要求就是保留它的版权声明。这一点相对于 MySQL 社区版的 GPL 协议友好许多。 -目前包括亚马逊,华为,阿里等世界五百强级别的大型企业在使用PG 技术;应用涵盖金融,能源,零售,IT,互联网等各个行业。PG 是大型企业和互联网去 Oracle 的优选方案,能够帮助企业有效管理数据和降低成本;也是大数据、云计算领域架构中关系数据库存储管理的最佳选择。同时,在国内也有包括阿里、腾讯、华为,瀚高在内的许多企业基于 PG 研发云产品及自主可控数据库产品。 +PG 是强大的企业级数据库,特别适合在大型企业数据管理中运用。作为一种企业级数据库,PG 具有的各种高级功能,像多版本并发控制(MVCC)、按时间点恢复(PITR)、表空间、异步复制、嵌套事务、在线热备、复杂查询的规划和优化以及为容错而进行的预写日志等。PG支持国际字符集、多字节编码并支持使用当地语言进行排序、大小写处理和格式化等操作。同时PG也在所能管理的大数据量和所允许的大用户量并发访问时间具有完全的高伸缩性。 + +目前包括亚马逊,华为,阿里等世界五百强级别的大型企业在使用PG技术;应用涵盖金融,能源,零售,IT,互联网等各个行业。PG 是大型企业和互联网去 Oracle 的优选方案,能够帮助企业有效管理数据和降低成本;也是大数据、云计算领域架构中关系数据库存储管理的最佳选择。同时,在国内也有包括阿里、腾讯、华为,瀚高在内的许多企业基于 PG 研发云产品及自主可控数据库产品。 工信部中国开源软件联盟 PostgreSQL 分会(简称中国PG 分会)是工信部下属,国内唯一官方认可的 PG 行业协会组织,承担在国内发展和推广PG 技术的职能。 基于Postgresql在中国发展的良好态势,由中国PG分会联合权威认证机构、知名培训机构共同打造中国 PostgreSQL 培训认证体系(简称“中国PG 培训认证”)。 diff --git "a/docs/postgresql/02.postgresql\345\256\211\350\243\205.md" "b/docs/postgresql/02.postgresql\345\256\211\350\243\205.md" index 50d6a973e..197cb3ec2 100644 --- "a/docs/postgresql/02.postgresql\345\256\211\350\243\205.md" +++ "b/docs/postgresql/02.postgresql\345\256\211\350\243\205.md" @@ -135,9 +135,9 @@ WantedBy=multi-user.target PostgreSQL安装后默认用户名和数据库也是"postgres",默认没有密码。在安装PostgreSQL之后可以以默认用户登录,也可以创建新当用户名。 -安装成功后,PostgreSQL 会自动创建一个默认用户(属于最高权限 Superuser),名称为 postgres,密码为空。 +安装成功后,PostgreSQL 会自动创建一个默认用户(这个属于最高权限的 superuser),名称为 postgres,密码为空。 -但是不支持远程登录(报错:psql: fe_sendauth: no password supplied),必须设置密码后才行(普通用户也适应这个规则)。 +但是不支持远程登录(报错:psql: fe_sendauth: no password supplied),必须设置密码后才行(普通用户也适用这个规则)。 ```shell @@ -238,7 +238,7 @@ help ``` -# 帐号权限体系 +# 角色管理 PostgreSQL 的权限管理模型,是一种典型的 RBAC(基于角色的权限控制)的实现。其将用户、角色、权限通过此模型管理起来。 @@ -249,6 +249,92 @@ PostgreSQL 的权限可以分为两类,"系统权限"和"数据库对象权限 可以通过授予角色/用户相应的系统权限和对象权限来对数据库进行管理。 + +角色可以拥有属性,属性确定了角色拥有的特权,并且在登录时与客户端认证系统进行交互。常见的角色属性包括: + +- **登录特权**,只有具有 LOGIN 属性的角色才能连接数据库。具有 LOGIN 角色的用户可以被看作一个"数据库用户"。 + ```SQL + CREATE ROLE name LOGIN; + CREATE USER name; + ``` + +- **超级用户**,数据的超级用户可以避开所有的权限检查,只验证登录权限。因此,这是一个很危险的特权,使用时需要特别小心;最好在日常的操作中避免使用超级用户。 + ```SQL + CREATE ROLE name SUPERUSER; + ``` + +- **创建数据库**,只有明确授权的角色才能够创建数据库(超级用户除外,因为他们可以避开权限检查)。 + ```SQL + CREATE ROLE name CREATEDB; + ``` + +- **创建角色**,只有明确授权的角色才能够创建其他角色(超级用户除外,因为他们可以避开权限检查)。 + ```SQL + CREATE ROLE name CREATEROLE; + ``` + + +```SQL + + +CREATE ROLE david + SUPERUSER|NOSUPERUSER /*是否超级用户,默认否*/ + CREATEDB|NOCREATEDB /*是否能建DB,默认否*/ + CREATEROLE|NOCREATEROLE /*是否能建ROLE,默认否*/ + INHERIT|INHERIT /*继承*/ + LOGIN|NOLOGIN /*是否能登录,默认否*/ /*能登陆的role等价于user*/ + REPLICATION|NOREPLICATION +ENCRYPTED PASSWORD 'david@123'; + + + +CREATE ROLE david;  /**默认不带LOGIN属性**/ +CREATE USER sandy;  /**默认具有LOGIN属性**/ +-- 用户sandy可以登录,角色david不可以登录。 + +SELECT rolname from pg_roles ; +SELECT usename from pg_user; --角色david创建时没有分配login权限,所以没有创建用户 + +``` + + + + +## 对象授权 + + +```SQL +-- 其中,privilege_list 权限列表可以是 SELECT、INSERT、UPDATE、DELETE、TRUNCATE等,ALL表示表上的所有权限。 +GRANT privilege_list | ALL ON [ TABLE ] table_name TO role_name; + +-- ALL TABLES IN SCHEMA 表示某个模式中的所有表,可以方便批量授权操作。 +GRANT privilege_list | ALL ON ALL TABLES IN SCHEMA schema_name TO role_name; +``` + + + + + + +## 角色成员 + +在现实的环境中,管理员通常需要管理大量的用户和对象权限。为了便于权限管理,减少复杂度,可以将用户进行分组,然后以组为单位进行权限的授予和撤销操作。 + +为此,PostgreSQL 引入了组(group)角色的概念。具体来说,就是创建一个代表组的角色,然后将该组的成员资格授予其他用户,让其成为该组的成员。 + + +```SQL + +-- 创建一个组角色,按照习惯,组角色通常不具有 LOGIN 特权,也就是不能作为一个用户登录。 +CREATE ROLE group_name; + + +-- 使用与对象授权操作相同的 GRANT 和 REVOKE 语句为组添加和删除成员 +``` + + + + ```shell #/bin/bash diff --git "a/docs/postgresql/04.\345\270\270\347\224\250SQL.md" "b/docs/postgresql/04.\345\270\270\347\224\250SQL.md" index bc25db47b..a20ee79e2 100644 --- "a/docs/postgresql/04.\345\270\270\347\224\250SQL.md" +++ "b/docs/postgresql/04.\345\270\270\347\224\250SQL.md" @@ -164,6 +164,39 @@ CREATE TABLE IF NOT EXISTS "db_TEST" +-- 建表 + +CREATE TABLE employees( + employee_id INTEGER NOT NULL, + first_name CHARACTER VARYING(20), + last_name CHARACTER VARYING(25) NOT NULL, + email CHARACTER VARYING(25) NOT NULL, + phone_number CHARACTER VARYING(20), + hire_date DATE NOT NULL, + salary NUMERIC(8,2), + commission_pct NUMERIC(2,2), + manager_id INTEGER, + department_id INTEGER, + CONSTRAINT emp_emp_id_pk PRIMARY KEY (employee_id), + CONSTRAINT emp_salary_min CHECK (salary > 0), + CONSTRAINT emp_email_uk UNIQUE (email), + CONSTRAINT emp_dept_fk FOREIGN KEY (department_id) REFERENCES departments(department_id) + CONSTRAINT emp_manager_fk FOREIGN KEY (manager_id) REFERENCES employees(employee_id) +) ; + + +-- employee_id:员工编号,整数类型,主键(通过表级约束为主键指定了名称emp_emp_id_pk) +-- first_name:员工名字,字符串 +-- last_name:员工姓氏,字符串,不能为空 +-- email:员工电子邮箱,字符串,不能为空,必须唯一(emp_email_uk) +-- phone_number:员工电话号码,字符串 +-- hire_date:员工雇佣日期,日期类型,不能为空 +-- salary:员工薪水,数字类型,必须大于零(emp_salary_min) +-- commission_pct:员工佣金百分比,数字类型 +-- manager_id:经理编号,外键(通过外键 emp_manager_fk 引用员工表的员工编号) +-- department_id,部门编号,外键(通过外键 emp_dept_fk 引用部门表 departments 的编号department_id) + + CREATE TABLE IF NOT EXISTS "DB_TEST" ( "id" SERIAL NOT NULL, diff --git "a/docs/postgresql/06.\347\224\250\346\210\267\350\207\252\345\256\232\344\271\211\345\207\275\346\225\260.md" "b/docs/postgresql/06.\347\224\250\346\210\267\350\207\252\345\256\232\344\271\211\345\207\275\346\225\260.md" new file mode 100644 index 000000000..33c20a425 --- /dev/null +++ "b/docs/postgresql/06.\347\224\250\346\210\267\350\207\252\345\256\232\344\271\211\345\207\275\346\225\260.md" @@ -0,0 +1,44 @@ +# User Defined Funtions + +PostgreSQL 提供了四种函数: + +- + +- + +- 内部函数 + +- C语言函数 + + + + + + +## 存储过程-User-Defined Procedures + +存储过程是与函数很相似的数据对象,区别之处在于: + +- + +- 存储过程没有返回值,因此 `CREATE PROCEDURE` 其中没有 `RETURN` 子句 + +- + + + + + +## 查询语句函数-Query Language (SQL) Functions + +```SQL +CREATE FUNCTION clean_emp() RETURNS void AS ' + DELETE FROM emp + WHERE salary < 0; +' LANGUAGE SQL; + +SELECT clean_emp(); + + clean_emp +----------- +```