Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1oaMfd-000143-43 for pgsql-bugs@arkaria.postgresql.org; Mon, 19 Sep 2022 19:43:09 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1oaMfb-0003R9-Nr for pgsql-bugs@arkaria.postgresql.org; Mon, 19 Sep 2022 19:43:07 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1oaMI5-0002Jn-0A for pgsql-bugs@lists.postgresql.org; Mon, 19 Sep 2022 19:18:49 +0000 Received: from sonic313-14.consmr.mail.bf2.yahoo.com ([74.6.133.124]) by makus.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.92) (envelope-from ) id 1oaMHx-0006ya-TE for pgsql-bugs@lists.postgresql.org; Mon, 19 Sep 2022 19:18:47 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1663615119; bh=2dzUUTGk5bqsH1NIW1T6knr6XlWGL09w6v2w6rCwUYU=; h=Date:From:To:Subject:References:From:Subject:Reply-To; b=dmedz8RNBPoUUvXFSWkNI4PIBf9K7sBhOcdJzlzWdaBl7AASbkS2xVAeHmLm9yR0CLJdmATry8Jcv+jprOTUCgPHNA5hTH+G/kOax1BYt+va+iAEhh6z78dLGfJ4X6PQO8KkUFO6PqHOTYn8BloK9RU4xmK8SUUCAso/iErHO9clW18pxOLZGPQc6OD9kY2kjMxoRF/IrzJwrKxNyX7yp/URlPk0W8lEXgdnz7/R/8et/6l/ZNj9sEuJ1NCcnM4leeWlOYxKtO/o1/by/fPUURhd9M5CkQSZdhAJI6wTw9Vz6KcSqFrmvwvC30mN0MNlxNSeDxQ/PerEZ/p7u+0CkQ== X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1663615119; bh=TQImmV2mZSsRJ3M3ZSE1Oe2zH48aOuLt3zIYoY6J8R7=; h=X-Sonic-MF:Date:From:To:Subject:From:Subject; b=NTzs7i0DEFnOV/9Rqrs0Mezdq1jwM7ORFVuTu8DeBsyhk+/Mm3EtIN68Iqncn5ERpofyJuTf4b59fssFEU8lgyjs9xAqf5dR5zPwPsGehoBiaTf4wGhIKMTn+qQo/haVhPzLIDSBRlG3+kidkBRz5IEEr6fJ3O9gi7yIJS7U3awT75ICw/hJun0jXLZSm6UJzscjU5Kl5eAqczo2GRynzYA3aFfB2LCe/U5OIzUuJgVEW87nAHBxo1wu+SL/atAuk7LPAcORl5bxEOKpQpQnBuMKTMOa6rwwrORh5hHYiNmV0FGLZ/2gCAVLzZiHkCGJJRBy+2fZ4h2Gqj1LXpTtZg== X-YMail-OSG: 8DcSc4EVM1mQMeGWgYWG85zvrAyBCH582A1pqig6IDmmOakKo470s.2U9U54yQD LGoKkd5dJib8HMTvQ.WRxSrHTPoaMQrsNaMvXiCjxxvUzVI7XGgoOSdXBFj3Dl6U7kyZ2Jy2htOl TWIOZD5Wt5VjWKEsAggyTjnTjRTpAiEM433z9P.Q4n_0ZnBg5jVbEzqeqo11O8wR6sA_wBdgqM54 KGdFC8CY9d1j2IT3L2elS2RZTqA0k524H8oMfeThJP1nB5Q3bUdctesm35HAnrTW1r9wJVpMI2UU zDAvlE6XHgCUBHy32G895PAN2YqDKsDmGh8QgbOSImnFa34io2Q38Ym38EDRawLkMk3mZnGXaobE ulxKryf11gC9i2PTh4WEM2M8PQvl55mAKJi40Hpf7.Vf8NTrWFvUagLyGP_Tov8NEc0WDh0Uw.Gs hOHdvtsNhGpXDU3jUQMSu0aa7pBj9SSkG2tZWngecUeJD2qAvDEpcKVwNuGXOo6SXDn4SpNbmdGn IdMMG9yHP0fRwdk8PT_DETk3eBMPMqov5A6KaCuozFQlDUuwq6ffEk_ZbdyyAGi8s5NkpeM8kMkr zkvRPisdQq2O49EC_vtzcGF93_ZQp4rkjQCLDZL4jVb5Q00iTrRrhY929x4o7U0e_WtziBEHSO0J DMDfZlhGAMOCXtYiP1QCL95N4Br799Y7oVFn6cN_TVed.Cu31m5qzHy3Qn.MMBjjIeOTe28rufkZ cvzIYEJsr9965SXMCpwL7uzWCGCWL8cgoTBtP7buroRCSZB6lmQQF7KKQynwy9Zmwu5gtEUBdDwy bpclYajITKIFg2qUrDxzH.U2YBALXM1w3CXOb350PemDQzCD_hOeW2Z01E8D009Bx7tr33nNSXkd MG9W2VHG89.NpeevW.eSSAw4i.ug6aSw00vMZOVlJWzf4uJ77MlIpeTeEt2s_eIU2WmXwwlrS6X5 aVClxsXu748sgiHpuxursZ.X7RShJEmGvJyxfFXtx2OOJktVtY3qWaSkM3Sy6EexbXCroJWoLgFN Jy8s2if_Lu6MvMr_Ks1RCsruaCWp2w5YTjnDnbu6RgLbcdJ312Ipw9XiQF_MSnWHx8eVDSHuYH0h XJf.OvwKhYYutFARinHggVYvvRtch1Ullcx7OuvWvEzt2BaPN.hrBNmfWiBbjotsWHT8FPfoxjnZ dmbHKXvPgwy13n7H1OGpfQRtCLdVmJbIm_uoOBP4.OQkxMEOcg_RRTU9AEhg3ZjQUocdzZAnIXwQ PEuDkjfXafdSjxMwU_CMpJw0zxgWSkPvqQv4_TfCOzVMvuE1fXJXfdg2GId1g_XHxR5Sg8a4F89r XC04LvFilXsinzRbbeodsLCt6h5esnJ8WQqi6S9Gjh00xsSwkfCMOLOWElyNESisJHoCID0e.2AM 6HB3Pf4W04JgdAZtp3Wt0XBX5xjjT_VqOdCLbhj4Pk1CwjLXS4q70B3f4womjf49nM8Dgr1ZhssU ELpbZkfaXpfIb28RD4CDK7Avc2paqEG.vNQO.g156S.43Hcs6difj5qJA6dOTiT2R4FhN3PsV1Bx 3H637WhwsavFBQcs.UbrxyudaoymZfpZKGKpOnyMrYfbfLCZA2kcPYyB6uP9X91YM1GTgoQYDjjh fnyzIwtSy_FjThgNi485loIMdhA7iifPcKpqGMjVcqXWkuYu9.ME_tzg1JwxlhNpBtqXsqwAml6Y oK5z4ehyQj34misYk0vQjbu0FgP1pGNJfFnwBt3BYnqZSRRr.VHp393gLjhO7wR52xVDIhXL9lYi jAjZTDU6OHCQYmgfK0hh3.GblqOmHdL7J0oWWVVyoxYyew206c0PqtbTzWT1_cvrDxH_uWdPM0L6 02bTZSmTx4yxKlJaboqM.dP6gLdJf85KUUy3iT7pAfZzQ1fs0h99YPdWqlFQv.NQum6sedIbau8c nfzhRBdPzKlXBiUEPWsrPvgthmqpqbA-- X-Sonic-MF: Received: from sonic.gate.mail.ne1.yahoo.com by sonic313.consmr.mail.bf2.yahoo.com with HTTP; Mon, 19 Sep 2022 19:18:39 +0000 Date: Mon, 19 Sep 2022 19:18:35 +0000 (UTC) From: eponymous alias To: pgsql-bugs@lists.postgresql.org Message-ID: <2085551791.33703.1663615115771@mail.yahoo.com> Subject: apparent loss of database access permissions MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_Part_33702_1240770102.1663615115771" References: <2085551791.33703.1663615115771.ref@mail.yahoo.com> X-Mailer: WebService/1.1.20663 YMailNodin Content-Length: 17924 List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk ------=_Part_33702_1240770102.1663615115771 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit I have been testing the use of pg_upgrade, and in so doing I notice that it loses most database access privileges which are listed under the "Access privileges" column in output from "psql --list". Setting that aside for the moment, I see the same kind of behavior without pg_upgrade in play, in a simple pg_dumpall and psql context to dump and restore my databases. It may be simpler for others to replicate the basic problem in that context, so I provide details here. I am testing with the Pg 10.22 release, but based on what I was seeing in upgrade testing, I believe the behavior probably carries through to the latest Pg 14.5 release as well. Steps to replicate: (1) Create a safe space for testing. mkdir -p /tmp/pg cd /tmp/pg cp /tmp/test-databases.sql.gz . cp /tmp/grants.sql.gz . gunzip test-databases.sql.gz gunzip grants.sql.gz pg_bin=/usr/lib/postgresql/10/bin (2) Initialize a fresh database. $pg_bin/initdb --locale=en_US.UTF-8 --auth=md5 -U postgres -D /tmp/pg/data --pwprompt (3) Start the database. $pg_bin/pg_ctl start (4) Load the database with my test databases. $pg_bin/psql -f test-databases.sql (5) Check the access permissions at this point. $pg_bin/psql --list (6) Apply certain access permissions to the databases. $pg_bin/psql -f grants.sql (7) Check the access permissions at this point. $pg_bin/psql --list (8) Optionally, stop and start the database. $pg_bin/pg_ctl stop $pg_bin/pg_ctl start (9) Check the access permissions at this point. $pg_bin/psql --list (10) Dump the databases. $pg_bin/pg_dumpall --clean --if-exists -f dumped-databases.sql (11) Restore the databases. $pg_bin/psql -f dumped-databases.sql (12) Check the access permissions at this point. $pg_bin/psql --list I have attached my test-databases.sql and grants.sql files for detailed inspection and unit testing. To simplify matters for those who don't want to run the tests themselves, here are the outputs from steps where we display the access permissions: Output from step (5): List of databases Name | Owner | Encoding | Collate | Ctype | Access privileges -----------------+-------------+----------+-------------+-------------+----------------------------- has_other_owner | report_user | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =Tc/report_user + | | | | | report_user=CTc/report_user+ | | | | | unused_user=CTc/report_user postgres | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | report_db | report_user | UTF8 | en_US.UTF-8 | en_US.UTF-8 | template0 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres + | | | | | postgres=CTc/postgres template1 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | postgres=CTc/postgres + | | | | | =c/postgres (5 rows) Output from step (7): List of databases Name | Owner | Encoding | Collate | Ctype | Access privileges -----------------+-------------+----------+-------------+-------------+----------------------------- has_other_owner | report_user | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =Tc/report_user + | | | | | report_user=CTc/report_user+ | | | | | unused_user=CTc/report_user postgres | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | report_db | report_user | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =Tc/report_user + | | | | | report_user=CTc/report_user template0 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres + | | | | | postgres=CTc/postgres template1 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | postgres=CTc/postgres + | | | | | =c/postgres (5 rows) Output from step (9) is the same as from step (7). Output from step (12); List of databases Name | Owner | Encoding | Collate | Ctype | Access privileges -----------------+-------------+----------+-------------+-------------+----------------------------- has_other_owner | report_user | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =Tc/report_user + | | | | | report_user=CTc/report_user+ | | | | | unused_user=CTc/report_user postgres | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | report_db | report_user | UTF8 | en_US.UTF-8 | en_US.UTF-8 | template0 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres + | | | | | postgres=CTc/postgres template1 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | postgres=CTc/postgres + | | | | | =c/postgres (5 rows) Observe that between step (7) and step (12), the access permissions on the has_other_owner database were kept intact, while the access permissions for the report_db database were apparently lost. From what I can tell, the difference between those two databases is how the access privileges were initially set up. The has_other_owner database has some extra privileges accorded to the unused_user (which is to say, a role other than the role that owns the database), while the report_db does not have such extra permissions beyond the permissions accorded to the owner of the database. Perhaps you will say that the access permissions shown for the report_db in step (7) amount to nothing more than those already accorded to the owner of the database. And thus there is no reason to dump them and restore them, as what I had in place after the restore is in fact effectively exactly what I had in place before the dump. But if that is the case, then why are those access permissions even listed at all in the output from step (7)? There is some verbiage about the display of access privilege info, in the last couple of paragraphs here: https://www.postgresql.org/docs/current/ddl-priv.html However, that info is pretty well buried, inasmuch as there is no direct mention of it in the psql documentation for the --list or \l options: https://www.postgresql.org/docs/current/app-psql.html Whatever the case, I find this behavior highly confusing. If I apply permissions, I expect them to be visible and to remain visible throughout normal backup/restore and upgrade procedures. And if for instance, only-default permissions are to be displayed as an empty field, that behavior should be consistent. Otherwise, it looks like the tooling is broken. In fact, I find that the explicit display of access permissions survives a database stop/start action, so there is something persistent about that state that is significant enough to evoke the explicit display even though a backup/restore action obviously destroys that state. ------=_Part_33702_1240770102.1663615115771 Content-Type: application/gzip Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="test-databases.sql.gz" Content-ID: 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 dYIswTC3OOf/AW+0sJD3jwAA ------=_Part_33702_1240770102.1663615115771 Content-Type: application/gzip Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="grants.sql.gz" Content-ID: H4sICHamKGMAA2dyYW50cy5zcWwAjc5LCsIwFIXheVdx99FRGkMMxLTk4TRYG6wgTciDbl9TFTpw 4PgevvtTiYQGxDn0AhQ+khOCUMbH/Qq6h8F0nOG2odsquuBjtiW5WI/YSEmEtkYR+Z1UaJDszDih RFXzgDTqkCIwX5L1eXbR+nV5C2V5WdMG7oFfJcGnfIsu/fHokzmNkP2+uW2eWMcf/e0AAAA= ------=_Part_33702_1240770102.1663615115771--