MySQL permissions -- can't create functions even with the 'CREATE ROUTINE' grant - mysql

When connecting to my server (from a different machine) I get
Error Code: 1044 Access denied for user 'username'#'%' to database 'dbname'
when I try to create a function. But when I look at my permissions
SHOW GRANTS FOR CURRENT_USER;
I get
'GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, SHUTDOWN, PROCESS, FILE, REFERENCES, INDEX, ALTER, SHOW DATABASES, SUPER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE ROUTINE ON *.* TO ''username''#''%'' IDENTIFIED BY PASSWORD ''--stripped--'' WITH GRANT OPTION'
In particular, this includes CREATE ROUTINE. Why can't I make a function? How can I change it so I can?

I think there is a CREATE FUNCTION that is separate from CREATE ROUTINE. But either way, since it looks like your user has 100% full access anyway you could do:
GRANT ALL PRIVILEGES ON *.* TO user#'%' INDENTIFIED BY 'password' WITH GRANT OPTION
However I would note it would be much better to set the '%' to 'localhost' and only access the database in this manner from a local machine (or at least a trusted IP). The lack of security with this could cause you trouble.
Definitely don't use this user/password to connect to the database from a web script!
Edit
I forgot: routines and functions have to be granted globally. Adding . tries to add the grant to the tables themselves which is why it doesn't work. Try:
GRANT ALTER ROUTINE,CREATE ROUTINE, EXECUTE ON * TO user#'%' IDENTIFIED BY 'password'
There's a longer description of it here: http://dev.mysql.com/doc/refman/5.0/en/grant.html

Related

rds unable to grant role to a user using root user

I have a mysql rds instance, when you make the instance you declare a root user and a password.
I am then using terraform to create a new user and give the user a role. However i get the following error:
Error running SQL (GRANT 'test_role' TO 'test_user'#'%'): Error 1227: Access denied; you need (at least one of) the WITH ADMIN, ROLE_ADMIN, SUPER privilege(s) for this operation
Putting terraform aside, if i attempt to assign a role to a user with mysql directly. I get the same error
CREATE ROLE 'test_role';
GRANT SELECT, EXECUTE ON checkpoint_gg.* TO 'test_role';
CREATE USER 'test_user'#'%' IDENTIFIED BY 'password';
GRANT 'test_role' TO 'test_user'#'%';
SHOW GRANTS FOR 'root'#'%';
'GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, PROCESS, REFERENCES, INDEX, ALTER, SHOW DATABASES, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER, CREATE ROLE, DROP ROLE ON *.* TO `root`#`%` WITH GRANT OPTION'
'GRANT APPLICATION_PASSWORD_ADMIN,BACKUP_ADMIN,FLUSH_OPTIMIZER_COSTS,FLUSH_STATUS,FLUSH_TABLES,FLUSH_USER_RESOURCES,INNODB_REDO_LOG_ARCHIVE,PASSWORDLESS_USER_ADMIN,SHOW_ROUTINE ON *.* TO `root`#`%` WITH GRANT OPTION'
mysql 8
I contacted aws technical support and they managed to replicate the issue and suggest a solution.
aws technical support
since RDS is a managed service, to maintain the system integrity and
stability, super user privileges are not provided even to the master
user of the DB instance, and therefore, such error message is
expected, as the RDS MySQL master user by default does not have the
ADMIN, ROLE_ADMIN, SUPER privileges.
They suggested, interestingly enough the master/root user can assign those roles to itself.
GRANT ROLE_ADMIN on *.* to root;
Once it has that privilege we can then grant a role to a user
GRANT 'test_role' TO 'test_user'#'%';
I did not know the master root user (not rdsadmin) could give it self admin role, when itself is not an admin or does not have super privileges.
Please try to create rds cluster with master username other than root, it can be reserved username.
As mentioned in the error, your user does not have ADMIN, ROLE_ADMIN or SUPER permissions. Grant one of this permission.
Also make sure that you actually use #'%' user, not #'localhost'

how to give super permission to (root) user in MYSQL, despite there being no super user?

I'm using MYSQL 8.0.25, running on WAMP server.
By mistake I changed user root's privilege by unchecked (insert) privilege and pressed (go), so the changes are assigned.
The problems are:
the super user (root) can't insert, see databases, create or do anything.
there is not another super user to give super permissions to (root) again or create super user like root
I can't create super user or return super permissions to (root) because there is no super user
I want to return all permissions to root again. What should I do?
could you help me
MySQL 8.0 Reference Manual / ... / How to Reset the Root Password
Perform generic operation described in "B.3.3.2.3 Resetting the Root Password: Generic Instructions". Instead of ALTER USER ... execute the next statements:
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, SHUTDOWN, PROCESS, FILE,
REFERENCES, INDEX, ALTER, SHOW DATABASES, SUPER, CREATE TEMPORARY TABLES,
LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW,
SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER,
CREATE TABLESPACE, CREATE ROLE, DROP ROLE
ON *.* TO `root`#`localhost` WITH GRANT OPTION;
GRANT APPLICATION_PASSWORD_ADMIN,AUDIT_ADMIN,BACKUP_ADMIN,BINLOG_ADMIN,
BINLOG_ENCRYPTION_ADMIN,CLONE_ADMIN,CONNECTION_ADMIN,ENCRYPTION_KEY_ADMIN,
FLUSH_OPTIMIZER_COSTS,FLUSH_STATUS,FLUSH_TABLES,FLUSH_USER_RESOURCES,
GROUP_REPLICATION_ADMIN,INNODB_REDO_LOG_ARCHIVE,INNODB_REDO_LOG_ENABLE,
PERSIST_RO_VARIABLES_ADMIN,REPLICATION_APPLIER,REPLICATION_SLAVE_ADMIN,
RESOURCE_GROUP_ADMIN,RESOURCE_GROUP_USER,ROLE_ADMIN,SERVICE_CONNECTION_ADMIN,
SET_USER_ID,SHOW_ROUTINE,SYSTEM_USER,SYSTEM_VARIABLES_ADMIN,
TABLE_ENCRYPTION_ADMIN,XA_RECOVER_ADMIN
ON *.* TO `root`#`localhost` WITH GRANT OPTION;
GRANT PROXY ON ''#'' TO 'root'#'localhost' WITH GRANT OPTION;

Granting privilege to existing user gives "you are not allowed to create a user with grant" even though the user already exists

I am logged in as root user and i just reinstalled the mysql server. login_manager isn't created as is shown when i execute SELECT * FROM mysql.user;. I now execute
CREATE USER 'login_manager'#'localhost' IDENTIFIED BY 'login_manager'; and when i check if the user is created, i can find it. Executing
GRANT INSERT
ON clients
TO login_manager;
where client is a table gives me the error i put in the title. Executing FLUSH PRIVILEGES; after creating the user didn't help either. I flushed privileges before creating the user. I looked that up, and normally this error comes when you try to create the user in the grant statement, which i am not doing.
I know this is long, but here are the Grants that root has:
'GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, SHUTDOWN, PROCESS, FILE, REFERENCES, INDEX, ALTER, SHOW DATABASES, SUPER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER, CREATE TABLESPACE, CREATE ROLE, DROP ROLE ON *.* TO `root`#`localhost` WITH GRANT OPTION'
and
'GRANT APPLICATION_PASSWORD_ADMIN,AUDIT_ADMIN,BACKUP_ADMIN,BINLOG_ADMIN,BINLOG_ENCRYPTION_ADMIN,CLONE_ADMIN,CONNECTION_ADMIN,ENCRYPTION_KEY_ADMIN,GROUP_REPLICATION_ADMIN,INNODB_REDO_LOG_ARCHIVE,INNODB_REDO_LOG_ENABLE,PERSIST_RO_VARIABLES_ADMIN,REPLICATION_APPLIER,REPLICATION_SLAVE_ADMIN,RESOURCE_GROUP_ADMIN,RESOURCE_GROUP_USER,ROLE_ADMIN,SERVICE_CONNECTION_ADMIN,SESSION_VARIABLES_ADMIN,SET_USER_ID,SHOW_ROUTINE,SYSTEM_USER,SYSTEM_VARIABLES_ADMIN,TABLE_ENCRYPTION_ADMIN,XA_RECOVER_ADMIN ON *.* TO `root`#`localhost` WITH GRANT OPTION'
and
'GRANT PROXY ON ''#'' TO 'root'#'localhost' WITH GRANT OPTION'
Your login_manager user has a Host entry, likely localhost or %.
Because of this, your GRANT technically isn't for that user, it's for a login_manager with no Host entry - so mysql knows it would have to create the user with no Host first.
Asuming you used localhost when you created the user, use this to do the grants:
GRANT INSERT
ON clients
TO 'login_manager'#'localhost';

Access denied to database that I have access to

I am trying to grant privileges to another user using phpmyadmin, I have access to the root user (cl43-flexfit) and have tried querying the following
GRANT ALL PRIVILEGES ON `cl43-flexfit`.* TO 'supuser'#'localhost';
But receive a response of:
Access denied for user 'cl43-flexfit'#'%' to database 'cl43-flexfit'
Although I use that database with the cl43-flexfit user frequently.
I have also looked at what the root users privileges are using SHOW GRANT
and was shown these:
GRANT USAGE ON *.* TO 'cl43-flexfit'#'%' IDENTIFIED BY PASSWORD 'password'
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, TRIGGER ON `cl43-flexfit`.* TO 'cl43-flexfit'#'%' WITH GRANT OPTION
and even when I try to add permissions to the user for every database (replacing cl43-flexfit.* with * .*) I get an error saying I do not have permission
Access denied for user 'cl43-flexfit'#'%' (using password: YES)
I have been in contact with my hosting service and they have said that everything is correct on their end.
I also do not have access to the privileges tab in PHPMyAdmin and therefore can not use the GUI, it must be done through written commands.
Thanks in advance and apologise if I have a lack of understanding
You cannot GRANT ALL unless you also hold all privileges, along with GRANT OPTION, which you do not.
You have to grant explictly, and list only the permissions that you have (and want to grant).
You can't grant anything ON *.* unless you globally hold the privilege you are trying to grant, on all objects, plus GRANT OPTION. Again, you don't have this.
USAGE means only that you are allowed to log in to the server, nothing more. This is a special case of ON *.* carrying no significant meaning, because merely logging into the server is associated with no particular object.
The hosting service is correct.
If you have other users, you can make only explicit grants of listed permissions, using the format shown in your own SHOW GRANTS output.
GRANT SELECT, INSERT, [more...], TRIGGER ON `cl43-flexfit`.* TO 'my-other-existing-user'#'%';

unable to alter routine in mysql

problem: unable to alter routines.
I'm using mysql 5.1.47. I created a user called 'testuser' and db's called "abc1,abc2,abc3".
At first I tried
GRANT ALL ON *.* TO 'testuser'#'%';(also::> GRANT ALL PRIVILEGES ON *.* TO 'testuser'#'%';)
FLUSH PRIVILEGES;
tried this also
GRANT ALL ON *.* TO 'testuser'#'%' IDENTIFIED BY 'passwd';
FLUSH PRIVILEGES;
This works fine and user testuser was able to create,alter routines.
Then I revoked all the privileges and even deleted the user testuser and again created testuser. Then I tried:
GRANT ALL ON abc1.* TO 'testuser'#'%';
tried this also
GRANT ALL ON abc1.* TO 'testuser'#'%' IDENTIFIED BY 'passwd';
GRANT ALTER ROUTINE ON abc1.* TO 'testuser'#'%';
FLUSH PRIVILEGES;
By using above methods (particular Db) I'm unable to alter routine.I tried all the hosts like localhost,%,127.0.0.1,local ip. I tried to alter routine using workbench, and it is blank without any error.
But testuser is able to create routine and able to edit routine created by testuser. But other routines which are created by some other users are not able to edit by testuser (both routines are in same db).
But when i give access to all db like:
GRANT ALL ON *.* TO 'testuser'#'%';
FLUSH PRIVILEGES;
then testuser is able to edit all the routines. Please help me to fix this issue.
Thanks.
vijai
You may need to flush priviliges:
flush privileges;
Or you may need something other than '%' (which I think might mean 'anything other than localhost')
I don't create any complicated grants in my work... but in testing systems, I always add 3 grants (3rd is for misconfigured /etc/hosts files which on some incorrectly configured systems map "localhost" to the first NIC IP):
grant all privileges on dbnamehere.* to username#'%' identified by 'passwordhere';
grant all privileges on dbnamehere.* to username#'localhost' identified by 'passwordhere';
grant all privileges on dbnamehere.* to username#'127.0.0.1' identified by 'passwordhere';
update mysql.user set password=OLD_PASSWORD('passwordhere') where user='username';
flush privileges;
I ran into a similar problem, where I created a new account for a junior developer via SQL Workbench with the following privileges on a specific schema: Alter, Alter Routine, Create, Create Routine, Delete, Execute, Insert, Select, Show View, Update.
I also executed flush privileges from the work bench to ensure that the latest privileges were applied, but everytime he would right click on a stored procedure and choose "Send to Sql Editor" -> Procedure Call nothing would show up. We tried changing all sorts of options and still couldn't get it to show up.
He was able to create new procedures and then edit these procedures, but could not edit or do anything except call existing procedures written by other users. FYI, I'll add that he didn't have any DB Administrative Roles assigned.
After fiddling around and researching, I got the notion to try providing privileges on the mysql schema, since that schema has the definitions of the stored procedures in the proc table. I started out by giving all privileges and whittled it down to just the "select" privilege on this schema, and after that, the developer was able to right click on the procedures and "Send to Sql Editor" -> Procedure Call as well as alter procedures.
I'm not 100% sure if this exactly solves your problem, but it does address a couple of items.
I'll also add that it is our security policy to provide the least amount of privileges possible for a user to do their work effectively, so reducing the number of privileges supplied is something to carefully consider.