PostgreSQL SET ROLE

2021-09-13 14:57 更新

SET ROLE — 設(shè)置當(dāng)前會話的當(dāng)前用戶標(biāo)識符

大綱

SET [ SESSION | LOCAL ] ROLE role_name
SET [ SESSION | LOCAL ] ROLE NONE
RESET ROLE

描述

這個命令把當(dāng)前 SQL 會話的當(dāng)前用戶標(biāo)識符設(shè)置為 role_name。 角色名可以寫成一個標(biāo)識符或者一個字符串。在 SET ROLE之后,對 SQL 命令的權(quán)限檢查時就 好像該角色就是原先登錄的角色一樣。

當(dāng)前會話用戶必須是指定的 角色role_name 的一個成員(如果會話用戶是一個超級用戶,則可以選擇任何角色)。

SESSIONLOCAL修飾符發(fā)揮的作用和 常規(guī)的SET命令一樣。

NONERESET形式把當(dāng)前用戶標(biāo)識符 重置為當(dāng)前會話用戶標(biāo)識符。這些形式可以由任何用戶執(zhí)行。

注解

使用這個命令可以增加特權(quán)或者限制特權(quán)。如果會話用戶角色具有 INHERIT屬性,則它會自動具有它能 SET ROLE到的所有角色的全部特權(quán)。在這種情況下 SET ROLE實際會刪除所有直接分配給會話用戶的特 權(quán)以及分配給會話用戶作為其成員的其他角色的特權(quán),只留下所提及 角色可用的特權(quán)。換句話說,如果會話用戶沒有 NOINHERIT屬性, SET ROLE會刪除 直接分配給會話用戶的特權(quán)而得到所提及角色可用的特權(quán)。

特別地,當(dāng)一個超級用戶選擇SET ROLE到一個非 超級用戶角色時,它們會丟失其超級用戶特權(quán)。

SET ROLE的效果堪比 SET SESSION AUTHORIZATION,但是涉及的特權(quán)檢查 完全不同。還有,SET SESSION AUTHORIZATION決定 后來的SET ROLE命令可以使用哪些角色, 不過用 SET ROLE更改角色并不會改變后續(xù) SET ROLE能夠使用的角色集。

SET ROLE不會處理角色的ALTER ROLE 設(shè)置指定的會話變量。這只在登錄期間發(fā)生。

SET ROLE不能在一個 SECURITY DEFINER函數(shù)中使用。

示例

SELECT SESSION_USER, CURRENT_USER;

 session_user | current_user 
--------------+--------------
 peter        | peter

SET ROLE 'paul';

SELECT SESSION_USER, CURRENT_USER;

 session_user | current_user 
--------------+--------------
 peter        | paul

兼容性

PostgreSQL允許標(biāo)識符 語法("rolename "),而 SQL 標(biāo)準(zhǔn)要求 角色名被寫成字符串。SQL 不允許在事務(wù)中使用這個命令,而 PostgreSQL并不做此限 制,因為并沒有原因需要這樣做。和RESET語法 一樣,SESSIONLOCAL修飾符是一種 PostgreSQL擴展。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號