Re: Table permissions - Mailing list pgsql-general

From salah jubeh
Subject Re: Table permissions
Date
Msg-id 1326907521.46116.YahooMailNeo@web161504.mail.bf1.yahoo.com
Whole thread Raw
In response to Re: Table permissions  ("A.M." <agentm@themactionfaction.com>)
Responses Re: Table permissions  ("A.M." <agentm@themactionfaction.com>)
List pgsql-general
Hello,

Thanks for the info, I have already solved this by writing the following function. Also, i think it is better than changing the schema tables directly

Regards
 

CREATE OR REPLACE FUNCTION grant_permissions  (org_tbl TEXT  , new_tbl TEXT , change_owner BOOLEAN) RETURNS VOID
AS
$$
    DECLARE
        tblOwner      text  := '';
        roleName      text  := '';
        privilegeType      text  := '';
        grantSql       text  := '';
    BEGIN
        -- Some checks
        IF NOT EXISTS (SELECT 1 FROM information_schema.tables WHERE table_name = $1) THEN
            RAISE EXCEPTION 'The relation % does not exists', $1;
        ELSIF NOT EXISTS (SELECT 1 FROM information_schema.tables WHERE table_name = $2) THEN
            RAISE EXCEPTION 'The relation % does not exists', $2;
        ELSIF  NOT EXISTS (SELECT 1 FROM information_schema.table_privileges WHERE table_name = $1) THEN
            RAISE EXCEPTION 'No privileges assigned to the relation %', $1;
        END IF;

        -- Change the table owner
        IF  (change_owner) THEN
            SELECT tableowner INTO  tblOwner  FROM pg_tables;
            grantSql = 'ALTER TABLE ' ||  quote_ident ($2) || ' OWNER TO ' || tblOwner || E';\n' ;
        END IF;

        -- Grant the privileges
        FOR roleName IN SELECT DISTINCT grantee FROM information_schema.table_privileges WHERE table_name = $1 LOOP
            -- 6 = DELETE, INSERT, UPDATE, SELECT, TRIGGER, REFERENCE
            IF (SELECT count(*) FROM information_schema.table_privileges WHERE table_name = $1 AND grantee = roleName)::INTEGER = 6 THEN
                grantSql = grantSql || 'GRANT SELECT ON TABLE ' ||quote_ident ($2) || ' TO ' || roleName ||E';\n' ;
            END IF;

            FOR privilegeType IN SELECT privilege_type FROM information_schema.table_privileges WHERE table_name = $1 AND grantee = roleName LOOP
                grantSql = grantSql || 'GRANT ' || privilegeType ||' ON TABLE ' || quote_ident ($2)  ||' TO '|| roleName || E';\n' ;
            END LOOP;
             
        END  LOOP;

        --Execute ALL
        EXECUTE grantSQL;
    END
$$ LANGUAGE 'plpgsql' ;



 


From: A.M. <agentm@themactionfaction.com>
To: salah jubeh <s_jubeh@yahoo.com>
Cc: pgsql <pgsql-general@postgresql.org>
Sent: Wednesday, January 18, 2012 5:44 PM
Subject: Re: [GENERAL] Table permissions


On Jan 18, 2012, at 8:48 AM, salah jubeh wrote:

> Hello,
>
> I have create a table from another table such as
>
> CREATE TABLE tmp_XXX AS SELECT * FROM XXX; 
>
>
> The  tmp_XXX  tables has no permissions assigned to it and I  want to assign it with the same owner and access privileges  of XXX  table. I had a look on pg catalog tables  http://www.postgresql.org/docs/8.4/static/catalogs.html to create a stored procedure to do this job for me. I have found some tables which might be useful to get the original table iformation. For example, I can use  pg_table to get the owner of the original table.  Also, I have found pg_roles. However, I was not able to find where the access privileges are stored.
>
> Is there a better way to do this task than extracting the access privileges from pg catalog ?  If not, where I can find the access privileges information ?
>

You are looking for pg_catalog.pg_class.relacl. Just copy that from the original table to the duplicate (and perhaps relowner, depending on your situation), and you will have duplicate permissions.

Cheers,
M
--
Sent via pgsql-general mailing list (pgsql-general@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-general


pgsql-general by date:

Previous
From: Antonio Franzoso
Date:
Subject: Re: Full text search - How to build a filtering dictionary
Next
From: Tom Lane
Date:
Subject: Re: Partial index does not make query faster