20.3. ЧленÑÑво в Ñоли
ЧаÑÑо бÑÐ²Ð°ÐµÑ Ñдобно ÑгÑÑппиÑоваÑÑ Ð¿Ð¾Ð»ÑзоваÑелей Ð´Ð»Ñ ÑпÑоÑÐµÐ½Ð¸Ñ ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ñавами: пÑава можно вÑдаваÑÑ Ð´Ð»Ñ Ð²Ñей гÑÑÐ¿Ð¿Ñ Ð¸ Ñ Ð²Ñей гÑÑÐ¿Ð¿Ñ Ð·Ð°Ð±Ð¸ÑаÑÑ. Ð Postgres Pro Ð´Ð»Ñ ÑÑого ÑоздаÑÑÑÑ ÑолÑ, пÑедÑÑавлÑÑÑÐ°Ñ Ð³ÑÑппÑ, а заÑем ÑленÑÑво в ÑÑой гÑÑппе вÑдаÑÑÑÑ ÑолÑм индивидÑалÑнÑÑ Ð¿Ð¾Ð»ÑзоваÑелей.
ÐÐ»Ñ Ð½Ð°ÑÑÑойки гÑÑпповой Ñоли ÑнаÑала нÑжно ÑоздаÑÑ ÑÐ°Ð¼Ñ ÑолÑ:
CREATE ROLE имÑ;
ÐбÑÑно гÑÑÐ¿Ð¿Ð¾Ð²Ð°Ñ ÑÐ¾Ð»Ñ Ð½Ðµ Ð¸Ð¼ÐµÐµÑ Ð°ÑÑибÑÑа LOGIN, Ñ
оÑÑ Ð¿Ñи желании его можно ÑÑÑановиÑÑ.
ÐоÑле Ñого как гÑÑÐ¿Ð¿Ð¾Ð²Ð°Ñ ÑÐ¾Ð»Ñ Ñоздана, в Ð½ÐµÑ Ð¼Ð¾Ð¶Ð½Ð¾ добавлÑÑÑ Ð¸Ð»Ð¸ ÑдалÑÑÑ Ñленов, иÑполÑзÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ GRANT и REVOKE:
GRANTгÑÑпповаÑ_ÑолÑTOÑолÑ1, ... ; REVOKEгÑÑпповаÑ_ÑолÑFROMÑолÑ1, ... ;
Членом Ñоли Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¸ дÑÑÐ³Ð°Ñ Ð³ÑÑÐ¿Ð¿Ð¾Ð²Ð°Ñ ÑÐ¾Ð»Ñ (поÑÐ¾Ð¼Ñ ÑÑо в дейÑÑвиÑелÑноÑÑи Ð½ÐµÑ Ð½Ð¸ÐºÐ°ÐºÐ¸Ñ
ÑазлиÑий Ð¼ÐµÐ¶Ð´Ñ Ð³ÑÑпповÑми и не гÑÑпповÑми ÑолÑми). ÐÑи ÑÑом база даннÑÑ
не допÑÑÐºÐ°ÐµÑ Ð·Ð°Ð¼ÑÐºÐ°Ð½Ð¸Ñ ÑленÑÑва по кÑÑгÑ. Также не допÑÑкаеÑÑÑ ÑпÑавление ÑленÑÑвом Ñоли PUBLIC в дÑÑгиÑ
ÑолÑÑ
.
Ð§Ð»ÐµÐ½Ñ Ð³ÑÑпповой Ñоли могÑÑ Ð¸ÑполÑзоваÑÑ ÐµÑ Ð¿Ñава двÑÐ¼Ñ ÑпоÑобами. Ðо-пеÑвÑÑ
, каждÑй Ñлен гÑÑÐ¿Ð¿Ñ Ð¼Ð¾Ð¶ÐµÑ Ñвно вÑполниÑÑ SET ROLE, ÑÑÐ¾Ð±Ñ Ð²Ñеменно «ÑÑаÑÑ» гÑÑпповой ÑолÑÑ. Ð ÑÑом ÑоÑÑоÑнии ÑÐµÐ°Ð½Ñ Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
иÑполÑзÑÐµÑ Ð¿Ð¾Ð»Ð½Ð¾Ð¼Ð¾ÑÐ¸Ñ Ð³ÑÑпповой Ñоли вмеÑÑо оÑигиналÑной Ñоли, под коÑоÑой бÑл вÑполнен вÑ
од в ÑиÑÑемÑ. ÐÑи ÑÑом Ð´Ð»Ñ Ð²ÑеÑ
ÑоздаваемÑÑ
обÑекÑов Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
владелÑÑем ÑÑиÑаеÑÑÑ Ð³ÑÑпповаÑ, а не оÑигиналÑÐ½Ð°Ñ ÑолÑ. Ðо-вÑоÑÑÑ
, Ñоли, имеÑÑие аÑÑибÑÑ INHERIT, авÑомаÑиÑеÑки иÑполÑзÑÑÑ Ð¿Ñава вÑеÑ
Ñолей, Ñленами коÑоÑÑÑ
они ÑвлÑÑÑÑÑ, в Ñом ÑиÑле и ÑнаÑледованнÑе ÑÑими ÑолÑми пÑава. ÐапÑимеÑ:
CREATE ROLE joe LOGIN INHERIT; CREATE ROLE admin NOINHERIT; CREATE ROLE wheel NOINHERIT; GRANT admin TO joe; GRANT wheel TO admin;
ÐоÑле подклÑÑÐµÐ½Ð¸Ñ Ñ ÑолÑÑ joe ÑÐµÐ°Ð½Ñ Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
бÑÐ´ÐµÑ Ð¸ÑполÑзоваÑÑ Ð¿Ñава, вÑданнÑе напÑÑмÑÑ joe, и пÑава, вÑданнÑе Ñоли admin, Ñак как joe «наÑледÑеÑ» пÑава admin. Ðднако пÑава, вÑданнÑе wheel, не бÑдÑÑ Ð´Ð¾ÑÑÑпнÑ, поÑÐ¾Ð¼Ñ ÑÑо, Ñ
оÑÑ joe неÑвно и ÑвлÑеÑÑÑ Ñленом wheel, ÑÑо ÑленÑÑво полÑÑено ÑеÑез ÑÐ¾Ð»Ñ admin, коÑоÑÐ°Ñ Ð¸Ð¼ÐµÐµÑ Ð°ÑÑибÑÑ NOINHERIT. ÐоÑле вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ:
SET ROLE admin;
ÑÐµÐ°Ð½Ñ Ð±ÑÐ´ÐµÑ Ð¸ÑполÑзоваÑÑ ÑолÑко пÑава, назнаÑеннÑе admin, а пÑава, назнаÑеннÑе Ñоли joe, не бÑдÑÑ Ð´Ð¾ÑÑÑпнÑ. ÐоÑле вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ:
SET ROLE wheel;
ÑÐµÐ°Ð½Ñ Ð±ÑÐ´ÐµÑ Ð¸ÑполÑзоваÑÑ ÑолÑко пÑава, вÑданнÑе wheel, а пÑава joe и admin не бÑдÑÑ Ð´Ð¾ÑÑÑпнÑ. ÐаÑалÑнÑй Ð½Ð°Ð±Ð¾Ñ Ð¿Ñав можно полÑÑиÑÑ Ð»Ñбой из команд:
SET ROLE joe; SET ROLE NONE; RESET ROLE;
ÐÑимеÑание
Ðоманда SET ROLE в лÑбой Ð¼Ð¾Ð¼ÐµÐ½Ñ ÑазÑеÑÐ°ÐµÑ Ð²ÑбÑаÑÑ Ð»ÑбÑÑ ÑолÑ, пÑÑмÑм или коÑвеннÑм Ñленом коÑоÑой ÑвлÑеÑÑÑ Ð¾ÑигиналÑÐ½Ð°Ñ ÑолÑ, под коÑоÑой бÑл вÑполнен вÑ
од в ÑиÑÑемÑ. ÐоÑÑÐ¾Ð¼Ñ Ð² пÑимеÑе вÑÑе не обÑзаÑелÑно ÑнаÑала ÑÑановиÑÑÑÑ admin пеÑед Ñем как ÑÑаÑÑ wheel.
ÐÑимеÑание
Ð ÑÑандаÑÑе SQL еÑÑÑ ÑÑÑкое ÑазлиÑие Ð¼ÐµÐ¶Ð´Ñ Ð¿Ð¾Ð»ÑзоваÑелÑми и ÑолÑми. ÐÑи ÑÑом полÑзоваÑели, в оÑлиÑие Ð¾Ñ Ñолей, не наÑледÑÑÑ Ð¿Ñава авÑомаÑиÑеÑки. Такое поведение Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿Ð¾Ð»ÑÑено в Postgres Pro, еÑли Ð´Ð»Ñ Ñолей, иÑполÑзÑемÑÑ
как Ñоли в ÑÑандаÑÑе SQL, ÑÑÑанавливаÑÑ Ð°ÑÑибÑÑ INHERIT, а Ð´Ð»Ñ Ñолей-полÑзоваÑелей в ÑÑандаÑÑе SQL â аÑÑибÑÑ NOINHERIT. Ðднако в Postgres Pro вÑе Ñоли по ÑмолÑÐ°Ð½Ð¸Ñ Ð¸Ð¼ÐµÑÑ Ð°ÑÑибÑÑ INHERIT. ÐÑо Ñделано Ð´Ð»Ñ Ð¾Ð±ÑаÑной ÑовмеÑÑимоÑÑи Ñ Ð²ÐµÑÑиÑми до 8.1, в коÑоÑÑÑ
полÑзоваÑели вÑегда могли иÑполÑзоваÑÑ Ð¿Ñава гÑÑпп, Ñленами коÑоÑÑÑ
они ÑвлÑÑÑÑÑ.
ÐÑÑибÑÑÑ Ñоли LOGIN, SUPERUSER, CREATEDB и CREATEROLE можно ÑаÑÑмаÑÑиваÑÑ ÐºÐ°Ðº оÑобÑе пÑава, но они никогда не наÑледÑÑÑÑÑ ÐºÐ°Ðº обÑÑнÑе пÑава на обÑекÑÑ Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
. ЧÑÐ¾Ð±Ñ Ð¸Ð¼Ð¸ воÑполÑзоваÑÑÑÑ, необÑ
одимо пеÑеклÑÑиÑÑÑÑ Ð½Ð° ÑолÑ, имеÑÑÑÑ ÑÑÐ¾Ñ Ð°ÑÑибÑÑ, Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ SET ROLE. ÐÑÐ¾Ð´Ð¾Ð»Ð¶Ð°Ñ Ð¿ÑедÑдÑÑий пÑимеÑ, можно ÑÑÑановиÑÑ Ð°ÑÑибÑÑÑ CREATEDB и CREATEROLE Ð´Ð»Ñ Ñоли admin. ÐаÑем пÑи вÑ
оде Ñ ÑолÑÑ joe, полÑÑиÑÑ Ð´Ð¾ÑÑÑп к ÑÑим пÑавам бÑÐ´ÐµÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ ÑолÑко поÑле вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ SET ROLE admin.
ÐÐ»Ñ ÑÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð³ÑÑпповой Ñоли иÑполÑзÑеÑÑÑ DROP ROLE:
DROP ROLE имÑ;
ÐÑбое ÑленÑÑво в гÑÑпповой Ñоли бÑÐ´ÐµÑ Ð°Ð²ÑомаÑиÑеÑки оÑозвано (в оÑÑалÑном на Ñленов ÑÑой Ñоли ÑÑо никак не повлиÑеÑ).