?
This document uses PHP Chinese website manual Release
SET [ SESSION | LOCAL ] ROLE role_name SET [ SESSION | LOCAL ] ROLE NONE RESET ROLE
這條命令將當(dāng)前會(huì)話的當(dāng)前用戶標(biāo)識(shí)為role_name。角色名可以寫成表識(shí)符或者是字符串文本。 在SET ROLE之后,SQL命令的權(quán)限檢查就好像當(dāng)初登錄的用戶是此命令指定的用戶那樣。
當(dāng)前會(huì)話的用戶必須是指定的role_name角色的成員。 但超級(jí)用戶可以選擇任何角色。
SESSION和LOCAL修飾詞的作用和普通的SET命令一樣。
NONE和RESET形式重置當(dāng)前用戶標(biāo)識(shí)為當(dāng)前會(huì)話用戶標(biāo)識(shí)符。 任何用戶都可以執(zhí)行這種形式。
使用這條命令,它可能會(huì)增加一個(gè)用戶的權(quán)限,也可能會(huì)限制一個(gè)用戶的權(quán)限。 如果會(huì)話用戶的角色有INHERITS屬性,那么它自動(dòng)擁有它能SET ROLE變成的角色的所有權(quán)限; 在這種情況下,SET ROLE實(shí)際上是刪除了所有直接賦予會(huì)話用戶的權(quán)限,以及它的所屬角色的權(quán)限, 只剩下指定角色的權(quán)限。另一方面,如果會(huì)話用戶的角色有NOINHERITS屬性, SET ROLE刪除直接賦予會(huì)話用戶的權(quán)限,而獲取指定角色的權(quán)限。
實(shí)際上,如果一個(gè)超級(jí)用戶SET ROLE為一個(gè)非超級(jí)用戶,它會(huì)失去其超級(jí)用戶權(quán)限。
SET ROLE有和SET SESSION AUTHORIZATION類似的效果, 但是其中涉及的權(quán)限檢查有區(qū)別。還有,SET SESSION AUTHORIZATION判斷有什 么角色可以用于稍后的SET ROLE命令, 而用SET ROLE并不修改稍后的SET ROLE可以設(shè)置的角色集。
SET ROLE不處理角色的ALTER ROLE設(shè)置所聲明的會(huì)話變量; 這僅發(fā)生在登陸期間。
SET ROLE不能在一個(gè)SECURITY DEFINER函數(shù)內(nèi)使用。
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)識(shí)符語法("rolename"), 而SQL標(biāo)準(zhǔn)要求角色名字寫成字符串文本。 SQL并不允許在事務(wù)里面執(zhí)行這條命令;PostgreSQL并未做此限制, 因?yàn)闆]有理由限制。SESSION和LOCAL修飾詞是PostgreSQL的擴(kuò)展,還有RESET語法也一樣。