Puede crear cuentas MySQL de dos formas:
Usando comandos GRANT
Manipulando las tablas de permisos MySQL directamente
El método preferido es usar comandos GRANT
,
ya que son más concisos y menos propenso a errores. .
GRANT
está disponible desde MySQL 3.22.11;
su sintaxis se describe en Sección 13.5.1.3, “Sintaxis de GRANT
y REVOKE
”.
Otra opción para crear cuentas es usar uno de los diversos
programas proporcionados por terceras partes que ofrecen
capacidades para administradores de MySQL.
phpMyAdmin
es una de ellos.
Los siguientes ejemplos muestran cómo usar el programa cliente
mysql para añadir nuevos usuarios. Estos
ejemplos asumen que los permisos se inicializan según las
pautas descritas en Sección 2.9.3, “Hacer seguras las cuentas iniciales de MySQL”. Esto
significa que para realizar cambios, debe conectar al servidor
MySQL como el usuario root
, y la cuenta
root
debe tener el privilegio
INSERT
para la base de datos
mysql
y el permiso administrativo
RELOAD
.
En primer lugar, use el programa mysql para
conectar al servidor como el usuario root
:
shell> mysql --user=root mysql
Si ha asignado una contraseña a la cuenta
root
, necesitará la opción
--password
o -p
para este
comando mysql y también para los mostrados a
continuación en esta sección.
Tras la conexión al servidor como root
,
puede añadir nuevas cuentas. El siguiente comando usa
GRANT
para inicializar nuevas cuentas:
mysql> GRANT ALL PRIVILEGES ON *.* TO 'monty'@'localhost' -> IDENTIFIED BY 'some_pass' WITH GRANT OPTION; mysql> GRANT ALL PRIVILEGES ON *.* TO 'monty'@'%' -> IDENTIFIED BY 'some_pass' WITH GRANT OPTION; mysql> GRANT RELOAD,PROCESS ON *.* TO 'admin'@'localhost'; mysql> GRANT USAGE ON *.* TO 'dummy'@'localhost';
Las cuentas creadas con estos comandos GRANT
tienen las siguientes propiedades:
Dos de las cuentas tienen un nombre de usuario de
monty
y una contraseña de
some_pass
. Ambas cuentas son cuentas de
superusuario con plenos permisos para hacer cualquier cosa.
Una cuenta ('monty'@'localhost'
) puede
usarse sólo cuando se conecte desde el equipo local. La
otra ('monty'@'%'
) puede usarse para
conectarse desde cualquier otro equipo. Note que es
necesario tener ambas cuentas para que
monty
sea capaz de conectarse desde
cualquier sitio como monty
. Sin la cuenta
localhost
, la cuenta anónima para
localhost
creada por
mysql_install_db tendría precedencia
cuando monty
conecte desde el equipo
local. Como resultado, monty
se trataría
como un usuario anónimo. La razón para ello es que el
usuario anónimo tiene un valor más específico en la
columna Host
que la cuenta
'monty'@'%'
y por lo tanto toma
precedencia en la ordenación de la tabla
user
. (La ordenación de la tabla
user
se discute en
Sección 5.6.5, “Control de acceso, nivel 1: Comprobación de la conexión”.)
Una cuenta tiene un nombre de usuario de
admin
y no tiene contraseña. Esta cuenta
puede usarse sólo desde el equipo local. Tiene los
privilegios administrativos RELOAD
y
PROCESS
. Éstos permiten al usuario
admin
ejecutar los comandos
mysqladmin reload, mysqladmin
refresh, y mysqladmin
flush-xxx
, así como
mysqladmin processlist . No se dan
permisos para acceder a ninguna base de datos. Puede añadir
tal privilegio posteriormente mediante un comando
GRANT
adicional.
Una cuenta tiene un nombre de usuario de
dummy
sin contraseña. Esta cuenta puede
usarse sólo desde el equipo local. No tiene ningún
privilegio. El permiso USAGE
en el
comando GRANT
permite crear una cuenta
sin darle ningún privilegio. Tiene el efecto de inicializar
todos los privilegios globales a 'N'
. Se
asume que se otorgarán privilegios específicos
posteriormente.
Como alternativa a GRANT
, puede crear la
misma cuenta directamente mediante comandos
INSERT
y después diciendo al servidor que
recargue las tablas de permisos usando FLUSH
PRIVILEGES
:
shell> mysql --user=root mysql mysql> INSERT INTO user -> VALUES('localhost','monty',PASSWORD('some_pass'), -> 'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y'); mysql> INSERT INTO user -> VALUES('%','monty',PASSWORD('some_pass'), -> 'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y'); mysql> INSERT INTO user SET Host='localhost',User='admin', -> Reload_priv='Y', Process_priv='Y'; mysql> INSERT INTO user (Host,User,Password) -> VALUES('localhost','dummy',''); mysql> FLUSH PRIVILEGES;
La razón de usar FLUSH PRIVILEGES
al crear
cuantas con INSERT
es decir al servidor que
vuelva a leer las tablas de permisos. De otro modo, los cambios
no se tienen en cuenta hasta que se reinicie el servidor. Con
GRANT
, FLUSH PRIVILEGES
no
es necesario.
La razón para usar la función PASSWORD()
con INSERT
es encriptar las contraseñas. El
comando GRANT
encripta la contraseña, así
que PASSWORD()
no es necesario.
El valor 'Y'
activa permisos para las
cuentas. Para la cuenta admin
, puede emplear
la sintaxis más clara extendida INSERT
usando SET
.
En el comando INSERT
para la cuenta
dummy
account, sólo las columnas
Host
, User
, y
Password
en el registro de la tabla
user
tienen valores asignados. Ninguna de las
columnas de permisos se asignan explícitamente, así que MySQL
les asigna a todas el valor por defecto de
'N'
. Esto es equivalente al funcionamiento de
GRANT USAGE
.
Para inicializar una cuenta de super usuario, sólo es necesario
crear una entrada en la tabla user
con las
columnas de permisos inicializadas a 'Y'
. Los
privilegios de la tabla user
son globales,
así que no se necesitan registros en ninguna de las otras
tablas de permisos.
Los siguientes ejemplos crean tres cuentas y les dan acceso a
bases de datos específicas. Cada una de ellas tiene un nombre
de usuario custom
y contraseña
obscure
.
Para crear las cuentas con GRANT
, use los
siguientes comandos:
shell> mysql --user=root mysql mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP -> ON bankaccount.* -> TO 'custom'@'localhost' -> IDENTIFIED BY 'obscure'; mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP -> ON expenses.* -> TO 'custom'@'whitehouse.gov' -> IDENTIFIED BY 'obscure'; mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP -> ON customer.* -> TO 'custom'@'server.domain' -> IDENTIFIED BY 'obscure';
Las tres cuentas pueden usarse de la siguiente manera:
La primera cuenta puede acceder a la base de datos
bankaccount
, pero sólo desde el equipo
local.
La segunda cuenta puede acceder la base de datos
expenses
, pero sólo desde el equipo
whitehouse.gov
.
La tercera cuenta puede acceder la base de datos
customer
, pero sólo desde el equipo
server.domain
.
Para inicializar las cuentas custom
sin usar
GRANT
, use los comandos
INSERT
como se explica para modificar las
tablas de permisos directamente:
shell> mysql --user=root mysql mysql> INSERT INTO user (Host,User,Password) -> VALUES('localhost','custom',PASSWORD('obscure')); mysql> INSERT INTO user (Host,User,Password) -> VALUES('whitehouse.gov','custom',PASSWORD('obscure')); mysql> INSERT INTO user (Host,User,Password) -> VALUES('server.domain','custom',PASSWORD('obscure')); mysql> INSERT INTO db -> (Host,Db,User,Select_priv,Insert_priv, -> Update_priv,Delete_priv,Create_priv,Drop_priv) -> VALUES('localhost','bankaccount','custom', -> 'Y','Y','Y','Y','Y','Y'); mysql> INSERT INTO db -> (Host,Db,User,Select_priv,Insert_priv, -> Update_priv,Delete_priv,Create_priv,Drop_priv) -> VALUES('whitehouse.gov','expenses','custom', -> 'Y','Y','Y','Y','Y','Y'); mysql> INSERT INTO db -> (Host,Db,User,Select_priv,Insert_priv, -> Update_priv,Delete_priv,Create_priv,Drop_priv) -> VALUES('server.domain','customer','custom', -> 'Y','Y','Y','Y','Y','Y'); mysql> FLUSH PRIVILEGES;
Los primeros tres comandos INSERT
añaden
registros en la tabla user
que permiten al
usuario custom
conectar desde los equipos con
la contraseña dada, pero no otorga privilegios blobales (todos
los privilegios se inicializan al valor por defecto
'N'
). Los siguientes tres comandos
INSERT
añaden registros en la tabla
db
que otorgan privilegios a
custom
para las bases de datos
bankaccount
, expenses
, y
customer
, pero sólo cuando se accede desde
los equipos apropiados. Como siempre, cuando modifique las
tablas de permisos directamente, debe decirle al servidor que
las recargue con FLUSH PRIVILEGES
para que
los cambios en los permisos tengan efecto.
Si quiere dar a un usuario específico acceso desde todas las
máquinas dentro de un dominio dado (por ejemplo,
mydomain.com
), puede realizar un comando
GRANT
que use el carácter comodín
'%
' en la parte del equipo del nombre de
cuenta:
mysql> GRANT ... -> ON *.* -> TO 'myname'@'%.mydomain.com' -> IDENTIFIED BY 'mypass';
Para hacer lo mismo modificando las tablas de permisos directamente, haga lo siguiente:
mysql> INSERT INTO user (Host,User,Password,...) -> VALUES('%.mydomain.com','myname',PASSWORD('mypass'),...); mysql> FLUSH PRIVILEGES;
Ésta es una traducción del manual de referencia de MySQL, que puede encontrarse en dev.mysql.com. El manual de referencia original de MySQL está escrito en inglés, y esta traducción no necesariamente está tan actualizada como la versión original. Para cualquier sugerencia sobre la traducción y para señalar errores de cualquier tipo, no dude en dirigirse a mysql-es@vespito.com.