PG学习异常总结篇:遇到并处理过的异常-持续更新

1、权限问题
数据库环境:阿里云RDS PostgreSQL 9.4
权限规划和实施:
RDS 高权限账号: rds_use所拥有的数据库:postgres用途:管理RDS使用
中间过度账号: dba_use所拥有的数据库:zntag用途:DB owner ;DBA平时管理和DDL语句操作时使用此账号连接到zntag库执行操作
程序连接账号:program_use 所拥有的数据库:zntag用途:程序配置账号,对所有者为  dba_use 账号的对象执行DML操作
开发查询账号:programer_use所拥有的数据库:zntag用途:程序员的查询账号,对所有者为 dba_use 账号的对象执行select操作
报错截图1

报错截图2

分析思路:通过报错可以发现是权限设置的问题,“报错截图1”说明program_use和programer_use两个账号对所有者为 dba_use的数据库对象无查询权限,“报错截图2”说明program_use账号对所有者为dba_use的数据库对象无sequence操作权限(首先排查的是DML权限,发现执行insert(显示指定自增列)、update、delete均无报错)
给出正确的授权方式并说明那一步会导致上面的异常:
第一步:以rds_use用户登录postgres库,创建用户
create user dba_use password 'dba_use' createdb;
create user program_use password 'dba_use'
create user programer_use password 'dba_use'
第二步:以dba_use用户登录并创建数据库
psql -h*.*.*.* -Udba_use -dpostgres
create database zntag;
第三步:以dba_use用户登录连接zntag库,并授权(问题就出在这一步,如果这里没有连接到zntag库就执行下面的授权则会出现截图1的报错,没有sequences的授权会出现截图2的报错)
psql -h*.*.*.* -Udba_use -dzntag
ALTER DEFAULT PRIVILEGES IN SCHEMA public grant all on tables toprogram_use;
ALTER DEFAULT PRIVILEGES IN SCHEMA public grant all on sequences to toprogram_use;
ALTER DEFAULT PRIVILEGES IN SCHEMA public grant select on tables to udev;
第四步:测试以dba_use创建的表,programer_use有DML权限,programer_use有select权限。
备注:每次DDL操作必须使用dba_use账号连接zntag进行操作;和其他数据库一样权限收回使用revoke from,即ALTER DEFAULT PRIVILEGES IN SCHEMA public revokeselect on tables from udev;;上述授权/收权方式对之前已存在的数据库对象无效(即只对后续创建的对象有效),之前已存在的对象需要单独手动重新授权/收权,即grant select on table_name in schema public to programer_use;revoke select on table_name in schema public from programer_use; grant all on sequence sequence_name to program_use;

2、主键冲突问题
表的主键默认使用serial类型作为主键,在显示插入部分数据之后,程序执行insert报错:

查询表的sequences属性,并将其值改大
psql -h*.*.*.* -p5432 -Udba_use -dzntag
zntag=> \d stag_id_seq
结果:
        Sequence "public.stag_id_seq"
    Column     |  Type   |        Value        
---------------+---------+---------------------
  sequence_name | name    | stag_id_seq
 last_value    | bigint  | 50
  start_value   | bigint  | 1
 increment_by  | bigint  | 1
  max_value     | bigint  | 9223372036854775807
  min_value     | bigint  | 1
  cache_value   | bigint  | 1
  log_cnt       | bigint  | 0
  is_cycled     | boolean | f
 is_called     | boolean | t
Owned by: public.stag.id

修改sequences值:
zntag=> alter sequence stag_id_seq restart with 100
或者使用下面的SQL语句也可以修改:
select setval('stag_id_seq', 100); -- 设置表的sequence值从多少开始

3、删除用户报错有对象依赖于此用户:把对象对用户的依赖关系取消即可。

4、常用命令
\l 查看有哪些数据库
\c [dbname] 切换到[dbname]数据库下
\? 查看pg中支持的命令
\d  查看整体表信息
\d [tablename] 查看具体表结构信息
\d+ [tablename] 查看具体表详细结构信息
\d [sequence_id] 查看sequence详细信息
\di [indexname] 查看索引详细信息

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值