Я прочитал все возможные решения, и все в порядке, если вы помните, чтобы подключиться к базе данных, прежде чем предоставить вещи;) В любом случае, спасибо всем остальным решениям !!!
user@server:~$ sudo su - postgres
create psql user:
postgres@server:~$ createuser --interactive
Enter name of role to add: readonly
Shall the new role be a superuser? (y/n) n
Shall the new role be allowed to create databases? (y/n) n
Shall the new role be allowed to create more new roles? (y/n) n
запустите psql cli и установите пароль для созданного пользователя:
postgres@server:~$ psql
psql (10.6 (Ubuntu 10.6-0ubuntu0.18.04.1), server 9.5.14)
Type "help" for help.
postgres=# alter user readonly with password 'readonly';
ALTER ROLE
подключитесь к целевой базе данных:
postgres=# \c target_database
psql (10.6 (Ubuntu 10.6-0ubuntu0.18.04.1), server 9.5.14)
You are now connected to database "target_database" as user "postgres".
предоставьте все необходимые привилегии:
target_database=# GRANT CONNECT ON DATABASE target_database TO readonly;
GRANT
target_database=# GRANT USAGE ON SCHEMA public TO readonly ;
GRANT
target_database=# GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly ;
GRANT
изменить привилегии по умолчанию для целей db public shema:
target_database=# ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO readonly;
ALTER DEFAULT PRIVILEGES
Единственное, что я бы изменил, - это jquery_getset_data.php
. Я бы использовал оператор switch вместо многих операторов if. Метод jQuery $ .post подходит для того, что вы делаете, говоря со сценарием, который влияет на базу данных (удаляет / обновляет / и т. д.), используя один из методов GET ajax ($ .load или $ .get), нарушающий спецификацию HTTP.
Чтобы уменьшить jquery_getset_data.php, я бы использовал шаблоны проектирования ООП, чтобы избежать переключателей и операторов if.
class ICommand
{
public:
function execute( );
};
class CommandGetItemA
{
public:
function execute( )
{
//do some staff here
};
};
а затем:
CommandsMap['getItemA'] = new CommandGetItemA( );
CommandsMap['setItemA'] = new CommandGetItemB( );
....
CommandsMap[ $_POST['instance']].execute( );
Я знаю, выглядит сложно, но на мой вкус выглядит намного лучше. Что касается вашего второго вопроса, я не уверен, что понял его, вы можете добавить дополнительные объяснения?
После того, как я увидел ваше обновление, я думаю, что вы можете ответить на второй вопрос:
.click(function() {
window[instance]( this);
});
Там "instance" - это имя функции , или вы можете обновить или добавить его последнее, чтобы оно стало именем функции;