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. <age...@themactionfaction.com>
To: salah jubeh <s_ju...@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

Reply via email to