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] 查看索引詳細信息

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章