【问题标题】:PGsql : Grant every single right to a user on a schemaPGsql :授予用户对模式的每一个权限
【发布时间】:2011-10-11 13:40:50
【问题描述】:

我不知道如何将每一项权利授予特定用户,我希望用户拥有架构上的每一项权利:

  • 在现有表上插入、删除、更新、选择……

我已经尝试过:

    GRANT ALL PRIVILEGES ON SCHEMA schema to "user";
    GRANT ALL ON SCHEMA schema to "local_518561";
    GRANT ALL PRIVILEGES ON table schema.table to "user";
    GRANT ALL ON table schema.table to "user";

查询返回成功,但每次我使用其他用户时都会出现权限不足错误。

【问题讨论】:

    标签: postgresql rights


    【解决方案1】:
    GRANT ALL PRIVILEGES ON                  SCHEMA schema_name TO role_name;
    GRANT ALL PRIVILEGES ON ALL TABLES    IN SCHEMA schema_name TO role_name;
    GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA schema_name TO role_name;
    

    【讨论】:

      【解决方案2】:

      如果您使用的是 PostgreSQL

      CREATE OR REPLACE FUNCTION grantTablesOfSchema (user VARCHAR,
         permissions VARCHAR, schema VARCHAR) RETURNS VARCHAR AS
      $body$
      DECLARE
        regActual   RECORD;
        numTables   INTEGER;
      BEGIN
      
         numTables := 0;
      
         FOR regActual IN
            SELECT tablename FROM pg_tables WHERE schemaname = schema
         LOOP
            numTables := numTables + 1;
      
            EXECUTE 'GRANT ' || permissions || ' ON ' || schema || '.' || regActual.tablename || ' TO ' || user;
         END LOOP;
      
         RETURN 'Tables: ' || numTables::VARCHAR;
      END;
      $body$
      LANGUAGE 'plpgsql';
      
      
      CREATE OR REPLACE FUNCTION grantSequencesOfSchema (user VARCHAR,
         permissions VARCHAR, database VARCHAR, schema VARCHAR) RETURNS VARCHAR AS
      $body$
      DECLARE
         regActual       RECORD;
         numSequences    INTEGER;
      BEGIN
      
         numSequences := 0;
      
         FOR regActual IN
            SELECT sequence_catalog, sequence_schema, sequence_name 
            FROM information_schema.sequences 
            WHERE sequence_catalog = database AND sequence_schema = schema
         LOOP
            numSequences := numSequences + 1;
      
            EXECUTE 'GRANT ' || permissions || ' ON ' || schema || '.' || regActual.sequence_name || ' TO ' || user;
         END LOOP;
      
         RETURN 'Sequences: ' || numSequences::VARCHAR;
      END;
      $body$
      LANGUAGE 'plpgsql';
      

      还有一个使用示例:

      CREATE USER user1 WITH PASSWORD 'user1@user1?user1';
      GRANT CONNECT ON DATABASE database1 TO user1;
      GRANT USAGE ON SCHEMA schema1 TO user1;
      
      SELECT * FROM grantTablesOfSchema ('user1', 'SELECT, UPDATE, INSERT, DELETE', 'schema1');
      
      SELECT * FROM grantSequencesOfSchema ('user1', 'ALL', 'database1', 'schema1');
      

      如果相反,您的 PostgreSQL 版本 >= 9:

      GRANT ALL ON ALL SEQUENCES IN SCHEMA schema1 TO user1;
      GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA schema1 TO user1;
      

      【讨论】:

        【解决方案3】:

        答案在于序列,如果您不授予表和序列(如果有)的权限,则无法插入。

        【讨论】:

          猜你喜欢
          • 2023-04-07
          • 2020-01-25
          • 2020-06-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多