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