Postgresql 学习笔记(1)

一、环境

#配置远程连接

su postgres  
vim /var/lib/pgsql/9.4/data/postgresql.conf   编辑配置文件  
listen_address=’localhost’ 前面的注释#去掉,并把’localhost’该为’*’;  
vim /etc/postgresql/8.2/main/pg_hba.conf  
host all all 192.168.1.0/24 password    password 可以设置为trust  
/etc/init.d/postgresql-8.2 restart 重启服务:还有stop start命令一样的。如果配置错误可能导致无法重启

二、语法:

psql -U postgres #进入数据库
\l #查看有哪些数据库 
\c postgresql  #选择postgresql 这个数据库,会提示进入连接 
\dt #查看所有表
\d tablename #查看某张表结构
\h #查看帮助

三、创建只读用户

#1.创建表
create table t1 ( id serial, name varchar(64) );
CREATE TABLE
postgres=# \dt        List of relations
 Schema | Name | Type  |  Owner   
--------+------+-------+----------
 public | t1   | table | postgres
(1 row)
2.创建用户u1
create role u1 with login password ‘123456‘; #login是赋予登录权限,否则是不能登录的
CREATE ROLE
3.赋予u1对表的只读权限(因为创建的普通用户默认是没有任何权限的)
postgres=# \c - u1
FATAL:  Peer authentication failed for user "u2"  
Previous connection kept

如果出现以上信息,则需改配置文件:
vim /etc/postgresql/9.6/main/pg_hba.conf
找到下面的一行:
local   all             postgres                                peer
改成:
local   all             postgres                                trust

如果出现下面的错误:
FATAL: Peer authentication failed foruser "mypguser"

请仍然修改pg_hba.conf文件,该下面行的peer为md5:
local   all    all    md5       # replace peer with md5
    
完成上面的修改后请重新加载postgresql:
/etc/init.d/postgresql reload

postgres=> select * from t1;
ERROR:  permission denied for relation t1
postgres=> \c - postgres
You are now connected to database "postgres" as user "postgres".
postgres=# grant select on all tables in schema public to u1;
GRANT
postgres=# \c - u1You are now connected to database "postgres" as user "u1".
postgres=> select * from t1;
 id | name 
----+------
(0 rows)
4.创建表t2
postgres=> \c - postgres
You are now connected to database "postgres" as user "postgres".
postgres=# create table t2 ( id serial, name varchar(64) );
CREATE TABLE
postgres=# \dt        List of relations
 Schema | Name | Type  |  Owner   
--------+------+-------+----------
 public | t1   | table | postgres
 public | t2   | table | postgres
(2 rows)
5.验证u1的权限
postgres=# \c - u1You are now connected to database "postgres" as user "u1".
postgres=> select * from t1;
 id | name 
----+------
(0 rows)

postgres=> select * from t2;
ERROR:  permission denied for relation t2 

可见u1是有t1表的读权限,但没有t2表的读权限,这样是不是意味着每次新建表就要赋一次权限?
6.解决办法
postgres=> \c - postgres
You are now connected to database "postgres" as user "postgres".
postgres=# alter default privileges in schema public grant select on tables to u1;
ALTER DEFAULT PRIVILEGES
# grant是赋予用户schema下当前表的权限
# alter default privileges是赋予用户schema下表的默认权限

postgres=# create table t3 ( id serial, name varchar(64) );
CREATE TABLE
postgres=# \dt        List of relations
 Schema | Name | Type  |  Owner   
--------+------+-------+----------
 public | t1   | table | postgres
 public | t2   | table | postgres
 public | t3   | table | postgres
(3 rows)

四、创建可更新用户

1.创建u2用户
postgres=# create role u2 with login password ‘123456‘;
CREATE ROLE
2.赋予更新权限
postgres=# alter default privileges in schema public grant select,insert,update,delete on tables to u2;
ALTER DEFAULT PRIVILEGES
3.创建表t4
postgres=# create table t4 ( id serial, name varchar(64) );CREATE TABLE
postgres=# \dt        List of relations
 Schema | Name | Type  |  Owner   
--------+------+-------+----------
 public | t1   | table | postgres
 public | t2   | table | postgres
 public | t3   | table | postgres
 public | t4   | table | postgres
(4 rows)
4.查看权限
postgres=# \c - u2You are now connected to database "postgres" as user "u2".
postgres=> insert into t4 values ( 1, ‘aa‘ );
INSERT 0 1
postgres=> select * from t4;
 id | name 
----+------
  1 | aa
(1 row)

postgres=> update t4 set name = ‘bb‘ where id = 1;
UPDATE 1
postgres=> select * from t4;
 id | name 
----+------
  1 | bb
(1 row)

postgres=> delete from t4 where id = 1;
DELETE 1
postgres=> select * from t4;
 id | name 
----+------
(0 rows)
5.序列的权限与解决办法
# 在insert的时候,指定列插入,主键id是serial类型会默认走sequence的下一个值,但前面
# 只赋予了表的权限,所以会出现下面的问题:

postgres=> insert into t4 ( name ) values ( ‘aa‘ );
ERROR:  permission denied for sequence t4_id_seq

# 解决方法就是再赋一次sequence的值就行了
postgres=> \c - postgres
You are now connected to database "postgres" as user "postgres".
postgres=# alter default privileges in schema public grant usage on sequences to u2;
ALTER DEFAULT PRIVILEGES
postgres=# create table t5 ( id serial, name varchar(64) );
CREATE TABLE
postgres=# \c - u2
You are now connected to database "postgres" as user "u2".
postgres=> insert into t5 ( name ) values ( ‘cc‘ );
INSERT 0 1postgres=> select * from t5;
 id | name 
----+------
  1 | cc
(1 row)

五、删除用户

postgres=> \c - postgres
You are now connected to database "postgres" as user "postgres".
postgres=# drop role u2;
ERROR:  role "u2" cannot be dropped because some objects depend on it
DETAIL:  privileges for table t5
privileges for sequence t5_id_seq
privileges for default privileges on new sequences belonging to role postgres in schema publicprivileges for table t4
privileges for default privileges on new relations belonging to role postgres in schema public

# 当我们删除用户的时候,会提示有权限依赖,所以我们要删除这些权限
postgres=# alter default privileges in schema public revoke usage on sequences from u2;
ALTER DEFAULT PRIVILEGES
postgres=# alter default privileges in schema public revoke select,insert,delete,update on tables from u2;
ALTER DEFAULT PRIVILEGES
postgres=# revoke select,insert,delete,update on all tables in schema public from u2;
REVOKE
postgres=# revoke usage on all sequences in schema public from u2;
REVOKE
postgres=# drop role u2;
DROP ROLE

六、修改用户密码

sudo -u postgres psql
ALTER USER postgres WITH PASSWORD ‘passwd‘;
时间: 2024-09-28 16:02:25

Postgresql 学习笔记(1)的相关文章

Postgresql学习笔记(二)配置文件

1.配置文件 配置文件控制着一个PostgreSQL服务器实例的基本行为,主要包含postgresql.conf.pg_hba.conf.pg_ident.conf (1)postgresql.conf 该文件包含一些通用设置,比如内存分配,新建database的默认存储位置,PostgreSQL服务器的IP地址,日志的位置以及许多其他设置.9.4版引入了 一个新的postgresql.auto.conf文件,任何时候执行Altersystem SQL命令,都会创建或重写该文件.该文件中的设置会

Postgresql学习笔记

Postgresql源码安装: 从http://www.postgresql.org/download/下载源码v9.4.5编译安装 ./configuremakesumake install  //安装完成adduser postgresmkdir /usr/local/pgsql/datachown postgres /usr/local/pgsql/datasu - postgres/usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data  

postgresql学习笔记(四)角色

1.在PostgreSQL安装过程中的数据初始化阶段,系统会默认创建一个名为postgres的角色(同时会创建一个名为postgres的同名database). 2.可以通过ident身份验证机制来将操作系统的的root用户映射到数据的Postgresql角色,这样可以实现root用户无密码直接登录 3.创建具备登录权限的角色 postgres=# create role leo login password 'king' createdb valid until 'infinity'; val

postgresql学习笔记(五)备份与恢复

1.备份工具:pg_dump和pg_dumpall pg_dump可备份一个指定的database pg_dumpall可一次性备份所有database的数据及系统全局数据 2.pg_dump和pg_dumpall工具不支持在命令行选项中设定登录密码,因此为了便于执行自动任务,你需要在postgres操作系统帐号的home文件夹下创建一个密码文件.pgpass来存储密码:或者也可以用PGPASSWORD环境变量来设定密码. 3.如果你希望每天都进行备份,那么使用pg_dump比pg_dumpal

postgresql学习笔记(三)连接管理

使用以下三个SQL语句来取消正在运行的查询并终止连接 (1)查出活动连接列表及其进程ID select * from pg_stat_activity; (2)取消连接上的活动查询 select pg_cancel_backend(procid); 该操作不会终止连接本身 (3)终止该连接 select pg_terminate_backend(procid); 如果你未停止某个连接上正在执行的语句就直接终止该连接,那么这些语句此时也会被停止掉.在上述步骤2执行完毕后,客户端应用的挂起状态被解除

Django学习笔记(三)—— 模型 model

疯狂的暑假学习之 Django学习笔记(三)-- 模型 model 参考:<The Django Book> 第5章 1.setting.py 配置 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.', # 用什么数据库管理系统 'NAME': '', # 数据库名称,如果用sqlite,要写完整路径 'USER': '', # 如果用sqlite,这个不用写 'PASSWORD': '', # 如果用sqlite,这个不用写

PDO学习笔记

1. 何为PDO? PDO(PHP数据对象) 是一个轻量级的.具有兼容接口的PHP数据连接拓展,是一个PHP官方的PECL库,随PHP 5.1发布,需要PHP 5的面向对象支持,因而在更早的版本上无法使用.它所提供的数据接入抽象层,具有与具体数据库类型无关的优势,为它所支持的数据库提供统一的操作接口.目前支持的数据库有Cubrid.FreeTDS / Microsoft SQL Server / Sybase.Firebird/Interbase 6.IBM DB2.IBM Informix D

PHP 数据库驱动、连接数据不同方式学习笔记

相关学习资料 http://www.php.net/manual/zh/refs.database.php http://www.php.net/manual/zh/internals2.pdo.php http://bbs.phpchina.com/thread-184537-1-1.html http://www.metsky.com/archives/660.html http://www.phpbuilder.com/ http://www.w3school.com.cn/php/php

node.js框架StrongLoop学习笔记(一)

node.js框架StrongLoop学习笔记(一) 本人在用node.js做手机后台,查找框架发现StrongLoop挺适合,可是却发现没有中文教程,于是在自己学习时,做一下笔记,以方便其他像我一样的人参考(本人的英语水平非常差,只能一点点试着做,并记录下来,如果大家发现问题,请通知我好更正,谢谢了!).所有操作都是在CentOS7-x64,Node.js 0.12.2下完成的. nodejs框架StrongLoop学习笔记一 安装StrongLoop 创建项目 安装数据库驱动 配置数据库连接