PostgreSQL基础语法解析
发表时间: 2022-03-25 14:08
概述
通过使用表空间,管理员可以控制一个PostgreSQL安装的磁盘布局。这么做至少有两个用处。
表空间与数据库的关系:
默认表空间
创建表空间
创建表空间语法
CREATE TABLESPACE tablespace_name [ OWNER user_name ] LOCATION 'directory' [ WITH ( tablespace_option = value [, ... ] ) ]
参数:
创建表空间
首先创建存储目录
$ mkdir -p /var/lib/pgsql/12/dbdata/mytb$ chown -R postgres:postgres /var/lib/pgsql/12/dbdata/mytb
CREATE TABLESPACE mytbspace LOCATION '/var/lib/pgsql/12/dbdata/mytb';
SET default_tablespace = mytbspace;# 查看默认表空间SHOW default_tablespace;
查看所有的表空间
SELECT * FROM pg_tablespace;或者\db# 列出更详细的信息\db+
PostgreSQL 创建数据库可以用以下三种方式:
语法:
CREATE DATABASE name [ [ WITH ] [ OWNER [=] user_name ] [ TEMPLATE [=] template ] [ ENCODING [=] encoding ] [ LC_COLLATE [=] lc_collate ] [ LC_CTYPE [=] lc_ctype ] [ TABLESPACE [=] tablespace_name ] [ CONNECTION LIMIT [=] connlimit ] ]
参数
例子:
CREATE DATABASE test WITH OWNER test TEMPLATE=template0 ENCODING 'UTF8' TABLESPACE test CONNECTION LIMIT 100;
createdb是SQL命令CREATE DATABASE的封装。
语法:
createdb [connection-option...] [option...] [dbname [description]]
选项:
环境变量
示例:
$ createdb mytestdb
只有数据库所有者且当前数据库没有连接的情况下才能执行删除操作。
语法:
DROP DATABASE [ IF EXISTS ] name;
语法:
ALTER DATABASE name [ [ WITH ] option [ ... ] ]# option 可以是以下参数:CONNECTION LIMIT connlimitALTER DATABASE name RENAME TO new_nameALTER DATABASE name OWNER TO new_ownerALTER DATABASE name SET TABLESPACE new_tablespaceALTER DATABASE name SET configuration_parameter { TO | = } { value | DEFAULT }ALTER DATABASE name SET configuration_parameter FROM CURRENTALTER DATABASE name RESET configuration_parameterALTER DATABASE name RESET ALL
示例:
关闭数据库test上缺省的索引扫描:
ALTER DATABASE test SET enable_indexscan TO off;
语法:
CREATE SCHEMA schema_name [ AUTHORIZATION role_specification ] [ schema_element [ ... ] ]CREATE SCHEMA AUTHORIZATION role_specification [ schema_element [ ... ] ]CREATE SCHEMA IF NOT EXISTS schema_name [ AUTHORIZATION role_specification ]CREATE SCHEMA IF NOT EXISTS AUTHORIZATION role_specification# 其中 role_specification 可以是:user_name| CURRENT_USER| SESSION_USER
参数:
示例:
创建一个模式:
CREATE SCHEMA myschema;
为用户joe创建一个模式,该模式也将被命名为 joe:
CREATE SCHEMA AUTHORIZATION joe;
语法:
ALTER SCHEMA name RENAME TO new_nameALTER SCHEMA name OWNER TO { new_owner | CURRENT_USER | SESSION_USER }
语法:
DROP SCHEMA [ IF EXISTS ] name [, ...] [ CASCADE | RESTRICT ]
参数:
语法:
创建角色使用CREATE ROLE
CREATE USER name [ [ WITH ] option [ ... ] ]这里 option 可以是:SUPERUSER | NOSUPERUSER| CREATEDB | NOCREATEDB| CREATEROLE | NOCREATEROLE| INHERIT | NOINHERIT| LOGIN | NOLOGIN| REPLICATION | NOREPLICATION| BYPASSRLS | NOBYPASSRLS| CONNECTION LIMIT connlimit| [ ENCRYPTED ] PASSWORD 'password' | PASSWORD NULL| VALID UNTIL 'timestamp'| IN ROLE role_name [, ...]| IN GROUP role_name [, ...]| ROLE role_name [, ...]| ADMIN role_name [, ...]| USER role_name [, ...]| SYSID uid
描述:
CREATE USER现在是CREATE ROLE的一个别名。唯一的区别是 CREATE USER中LOGIN 被作为默认值,而NOLOGIN是 CREATE ROLE的默认值。
参数:
示例:
CREATE USER davide WITH PASSWORD 'jw8s0F4';
CREATE ROLE miriam WITH LOGIN PASSWORD 'jw8s0F4' VALID UNTIL '2005-01-01';
CREATE ROLE admin WITH CREATEDB CREATEROLE;
语法:
DROP USER等同于DROP ROLE
DROP ROLE [ IF EXISTS ] name [, ...]
授权
权限回收
$ mkdir -p /var/lib/pgsql/12/dbhome/test$ chown -R postgres:postgres /var/lib/pgsql/12/dbhome/$ su - postgres$ psqlpostgres=# create tablespace test location '/var/lib/pgsql/12/dbhome/test';CREATE TABLESPACE
postgres=# create user test with password 'test';CREATE ROLE
postgres=# CREATE DATABASE test WITH OWNER=test TEMPLATE=template0 ENCODING='UTF8' TABLESPACE=test CONNECTION LIMIT=100;postgres=# select oid,datname from pg_database;oid | datname -------+-----------14187 | postgres1 | template114186 | template016390 | test(4 rows)
# 切换数据库\c test;# 查看当前的search_pathSHOW search_path;# 创建一个新的schemaCREATE SCHEMA <schema名称>;# 默认schema更改为新的schema,在连接级别SET search_path TO <schema名称>;# 将数据库的默认schema更改为新的schemaALTER DATABASE <数据库名> SET search_path TO <schema名称>;# 将用户的默认schema更改为新的schemaALTER USER <用户名> SET search_path to <schema名称>;# 把适用于该对象的所有权限都赋予目标角色GRANT ALL ON SCHEMA <schema名称> TO <用户名>;GRANT ALL ON ALL TABLES IN SCHEMA <schema名称> TO <用户名>;
select version();select PostGIS_Full_Version();
select * from pg_tables
select * from current_user;
select * from pg_roles;select * from pg_user;# 或\du
\l