用户所能进行的操作...操作包括:查询、更改、插入、删除、修改、管理等等,要知道这些都是分开算的说是在'mysql'库里面的user db tables_priv、columns_priv这些表里面...新加用户INSERT INTO user VALUES('hostname','username',PASSWORD('pass'), 'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y')也可以用GRANT...不过我没试过hth
GRANT 权限 ON 数据库或表 TO 用户名@IP [IDENTIFIED BY 'password'] 权限可以是:ALL PRIVILEGES(所有权限) 数据库或表:可以是*.*(所有数据库) 用户名:可以用“ "%" ”(所有用户) IP:这个对应的IP能登录系统,也可以用%等通配符。 后面是可选项,如果是超级用户,必须使用密码。
TO jxbicestare(香波) GRANT SELECT (Host,User,Password),UPDATE(Password) ON mysql.user TO test@localhost IDENTIFIED BY 'test';TO huahua0168(huahua) 呵呵,这是以前写的一篇习作, 在 CSDN 上发过帖,后来删除了, 有空时重新整理一下,再帖出来!
找到了,可惜在使用列权限时不能用 all privileges ,还好列权限本来就没几个。
非常感谢shuixin13(犬犬(心帆)) 的解答。问题1. 我的语句grant all on snc.* to test identified by 'try'; 将snc数据库授权给密码为try的test用户 其中test用户原本不存在 之后,我flush privileges,用mysql -u test -p登陆,输入try后发生错误 ERROR 1045: Access denied for user: 'test@localhost' (Using password: YES) 什么问题呢?问题2. 我的设想是利用test用户登陆,之后去mysql.tables_priv中读取他的权限,根据他能操作 的表进行处理,调用相应的表单。现在的疑问是,普通用户(在user中无特殊权限)能不能 操作mysql.tables_priv?本来想自己实验,没想到发生错误,在这里一并问了吧。
呵呵,你的操作语句是 grant all on snc.* to test identified by 'try'; 在授权表中将会产生一个Host = % User = test Password = ***的用户授权信息,而你通过 mysql -u test -ptry 登录时,却不会匹配这条用户信息 而是匹配你的用户授权表中的 Host = localhost User = 空 Password = 空的用户信息为什么会匹配这一条呢, 呵呵,看一看 MySQL 中对用户权限表的排序吧!!! 你的第二个问题其它我在上次已回答过了, GRANT SELECT (Host,Db,User,Table_Name) ON mysql.tables_priv TO test@localhost IDENTIFIED BY 'test';
'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y')也可以用GRANT...不过我没试过hth
权限可以是:ALL PRIVILEGES(所有权限)
数据库或表:可以是*.*(所有数据库)
用户名:可以用“ "%" ”(所有用户)
IP:这个对应的IP能登录系统,也可以用%等通配符。
后面是可选项,如果是超级用户,必须使用密码。
二、用户授权详述2.1 MySQL授权表的结构和内容
MySQL的安全/权限系统是非标准的,但是技术先进!
客户对MySQL数据库的访问权限均由授权表内容来控制。
这些表是以MySQL数据库文件形式存放在mysql数据库中,
并在第一次安装MySQL的过程中初始化(运行mysql_install_db脚本),
在MySQL启动时和在执行用户权限刷新时,服务器读入这些数据库表内容。
授权表共有5个表:user、db、host、tables_priv和columns_priv。
对用户权限的控制,你完全可以标准SQL语句来进行操纵。
表1 user、db和host授权表结构
+-------------+----------------+----------------+----------------+
| 表名 | user | db | host |
+-------------+----------------+----------------+----------------+
| 访问范围列 | Host | Host | Host |
| | User | Db | Db |
| | Password | User | |
+-------------+----------------+----------------+----------------+
| 库/表权限列 | Alter_priv | Alter_priv | Alter_priv |
| | Create_priv | Create_priv | Create_priv |
| | Delete_priv | Delete_priv | Delete_priv |
| | Drop_priv | Drop_priv | Drop_priv |
| | Index_priv | Index_priv | Index_priv |
| | Insert_priv | Insert_priv | Insert_priv |
| | References_priv| References_priv| References_priv|
| | Select_priv | Select_priv | Select_priv |
| | Update_priv | Update_priv | Update_priv |
| | File_priv | Grant_priv | Grant_priv |
| | Grant_priv | | |
| | Process_priv | | |
| | Reload_priv | | |
| | Shutdown_priv | | |
+-------------+----------------+----------------+----------------+表2 tables_priv和columns_priv属权表结构
+-------------+----------------+----------------+
| 表名 | tables_priv | columns_priv |
+-------------+----------------+----------------+
| 访问范围列 | Host | Host |
| | Db | Db |
| | User | User |
| | Table_name | Table_name |
| | | Colunm_name |
+-------------+----------------+----------------+
| 权限列 | Table_priv | Colunm_priv |
| | Colunm_priv | |
+-------------+----------------+----------------+
| 其它字段 | Timestamp | Timestamp |
| | Grantor | |
+-------------+----------------+----------------+授权表的用途: user表
user表列出可以连接服务器的用户及其口令,并且它指定他们有哪种全局(超级用户)权限。
范围字段决定是否允许或拒绝到来的连接。
对于允许的连接,权限字段指出用户的全局(超级用户)权限,并适用于所有数据库。
例如,如果你设定某用户的 Delete_priv='Y',
则这个用户可以从任何表中删除记录。 db表
范围字段决定用户能从哪个主机存取哪个数据库。
权限字段决定允许哪个操作。
在这里指定的权限适用于一个数据库中的所有表。
host表
host表与db表结合使用在一个较好层次上控制特定主机对数据库的访问权限,
这可能比单独使用db好些。db和host表一起使用:
当你想要一个给定的db条目应用于若干主机时,host表作为db表的扩展被使用。
例如,如果你想要一个用户能在你的网络从若干主机使用一个数据库,
在用户的db表的Host条目设为空值,然后将那些主机的每一个移入host表。
tables_priv表
指定表级权限,在这里指定的一个权限适用于一个表的所有列。 columns_priv表
指定列级权限,这里指定的权限适用于一个表的特定列。tables_priv和columns_priv表类似于db表,但是更精致:他们作用于表和列级而非作用于数据库级。 注意管理权限(reload, shutdown, 等等)仅在user表中被指定。
这是因为管理性操作是服务器本身的操作并且不是特定数据库,因此没有理由在其他授权表中列出这样的权限。
事实上,只需要检查user表来决定你是否有权限执行一个管理操作。 file权限也仅在user表中指定。
它虽然不是管理性权限,但你在服务器主机上的读或写文件的的权力是独立于你正在存取的数据库的。
注:
tables_priv和columns_priv表在MySQL 3.22.11版引进(与GRANT语句同时)。
如果你使用较早版本的MySQL,你的mysql数据库将只有user、db和host表。
如果你从老版本升级或更新到3.22.11,而没有tables_priv和columns_priv表,运行mysql_fix_privileges_tables脚本创建它们。MySQL没有rows_priv表,因为它不提供记录级权限。
例如,你不能限制用户于表中包含特定列值的行。如果你确实需要这种能力,你必须用应用编程来提供。
如果你想执行建议的记录级锁定,你可用GET_LOCK()函数做到。
授权表包含两种列:决定一个权限何时运用的范围列和决定授予哪种权限的权限列。
2.1.1 授权表范围列
授权表范围列指定表中的权限何时运用。
每个授权表条目包含Host和User列来指定权限何时运用于一个从某主机的连接服务器的用户。
其他表包含附加的范围列,如db表包含一个Db列指出权限运用于哪个数据库。
类似地,tables_priv和columns_priv表包含范围字段,缩小范围到一个数据库中的特定表或一个表的特定列。
范围列内容
一些范围列要求文字值,但它们大多数允许通配符或其他特殊值。
Host
Host列值可以是一个主机名、一个IP地址或'localhost'指出本地主机。
你可以在Host字段里使用通配符字符“%”和“_”。
%值匹配所有主机,并可用于允许一个用户从任何地方连接。一个空白的Host值等同于%。
如%wisc.edu匹配任何wisc.edu域内的主机,而%.edu匹配任何教育学院的主机。
类似地,192.168.%匹配任何在192.168 B类子网的主机,
而192.168.3.%匹配任何在192.168.3 C类子网的主机。
(例外:在db表中,一个空白Host值含义是“进一步检查host表”)User
用户名必须是文字的或空白。
User字段中不支持通配符,但是你能指定一个空白值匹配任何用户。
%作为一个User值并不意味着空白,相反地它匹配一个字面上的%名字,这可能不是你想要的。
口令值可以是空或非空,不允许用通配符。
一个空口令并不意味着匹配任何口令,它意味着用户连接服务器时不得指定口令。
口令是以一个加密过的值存储的,而不是一个字面上的文本。
如果你在Password列中存储一个实际字面上的口令,用户将不能连接!
GRANT语句和mysqladmin password命令为你自动加密口令,
但是如果你用诸如INSERT、REPLACE、UPDATE或SET PASSWORD等命令,
一定要用PASSWORD("new_password")函数而不是简单的"new_password"来指定口令。
例如 UPDATE user SET Password=PASSWORD('your password') WHERE User='root';Db
在columns_priv和tables_priv表中,Db值必须是真正的数据库名,不允许模式和空白。
但在db表和host表中,Db值可以以字面意义指定或使用SQL模式字符'%'或'_'指定一个通配符。
一个'%'或空白匹配任何数据库。 Table_name,Column_name
这些列中的值必须是照字面意思的表或列名,不允许模式和空白。 某些范围列被服务器视为大小写敏感的,其余的则不是。
这些原则总结在下表中。
特别注意Table_name值总是被看作大小写敏感的,
在查询中使用的表名的大小写敏感性要视MySQL服务器运行的主机的文件系统而定(UNIX下是大小写敏感,而Windows不是)。表3 授权表范围列的大小写敏感性
+--------------+-----+-----+---------+----+-----------+------------+
| 列 |Host |User |Password |Db |Table_name |Column_name |
| 大小写敏感性 |No |Yes |Yes |Yes |Yes |No |
+--------------+-----+-----+---------+----+-----------+------------+ 2.1.2 授权表权限列
授权表还包含权限列,他们指出在范围列中指定的用户拥有何种权限。
+------------+-----------------+----------------------+
| 权限 | 列 | 作用域 |
+------------+-----------------+----------------------+
| select | Select_priv | 表 |
| insert | Insert_priv | 表 |
| update | Update_priv | 表 |
| delete | Delete_priv | 表 |
| index | Index_priv | 表 |
| alter | Alter_priv | 表 |
| create | Create_priv | 数据库、表或索引 |
| drop | Drop_priv | 数据库或表 |
| grant | Grant_priv | 数据库或表 |
| references | References_priv | 数据库或表 |
| reload | Reload_priv | 服务器管理 |
| shutdown | Shutdown_priv | 服务器管理 |
| process | Process_priv | 服务器管理 |
| file | File_priv | 在服务器上的文件存取 |
+------------+-----------------+----------------------+数据库和表权限
下列权限运用于数据库和表上的操作。 ALTER
允许使用ALTER TABLE语句
CREATE
允许创建数据库和表,但不允许创建索引。
DELETE
允许从表中删除现有记录。
DROP
允许删除(抛弃)数据库和表,但不允许删除索引。
INDEX
允许创建并删除索引。
REFERENCES
目前不用。
SELECT
允许使用SELECT语句从表中检索数据。对不涉及表的SELECT语句就不必要,如SELECT NOW()或SELECT 4/2。
UPDATE
允许修改表中的已有的记录。 管理权限
下列权限运用于控制服务器或用户授权能力的操作的管理性操作。 FILE
允许读写服务器主机上的文件。该权限不应该随便授予,它很危险。
虽然已经授予读写权限,但所写的文件必须不是现存的文件,
这防止你迫使服务器重写重要文件,如/etc/passwd或属于别人的数据库的数据目录。
如果授权FILE权限,确保UNIX不以root用户运行服务器,因为root可在文件系统的任何地方创建新文件。
如果你以一个非特权用户运行服务器,服务器只能该给用户能访问的目录中创建文件。GRANT
允许将自己的权限授予别人,包括GRANT。
PROCESS
允许通过使用SHOW PROCESS语句或mysqladmin process命令查看服务器内正在运行的线程(进程)的信息。
这个权限也允许你用KILL语句或mysqladmin kill命令杀死线程。
你同样可以看到或杀死你自己的线程。
PROCESS权限赋予了你对任何线程做这些事情的权力。RELOAD
允许执行大量的服务器管理操作。
你可以发出FLUSH语句,
你也能执行mysqladmin的reload、refresh、flush-hosts、flush-logs、flush-privileges和flush-tables等命令。 SHUTDOWN
允许用mysqladmin shutdown关闭服务器。
在user、db和host表中,每一个权限以一个单独的列指定。
这些列全部声明为一个ENUM("N","Y")类型,所以每个权限的缺省值是“N”。
在tables_priv和columns_priv中的权限以一个SET表示,它允许权限用一个单个列以任何组合指定。在tables_priv表中的Table_priv列被定义成:
SET('Select','Insert','Update','Delete','Create','Drop','Grant','References','Index','Alter')在coloums_priv表中的Column_priv列被定义成:
SET('Select','Insert','Update','References')user表包含某些在其他授权表不存在的权限的列:
File_priv、Process_priv、Reload_priv和Shutdown_priv。
这些权限允许你让服务器执行的与任何特定数据库或表不相关的操作。
如允许一个用户根据当前数据库是什么来关闭数据库是毫无意义的。
database.table.coloum 在grant语句中出错。
GRANT SELECT (Host,User,Password),UPDATE(Password)
ON mysql.user
TO test@localhost
IDENTIFIED BY 'test';TO huahua0168(huahua) 呵呵,这是以前写的一篇习作,
在 CSDN 上发过帖,后来删除了,
有空时重新整理一下,再帖出来!
,还好列权限本来就没几个。
我的语句grant all on snc.* to test identified by 'try';
将snc数据库授权给密码为try的test用户
其中test用户原本不存在
之后,我flush privileges,用mysql -u test -p登陆,输入try后发生错误
ERROR 1045: Access denied for user: 'test@localhost' (Using password: YES)
什么问题呢?问题2.
我的设想是利用test用户登陆,之后去mysql.tables_priv中读取他的权限,根据他能操作
的表进行处理,调用相应的表单。现在的疑问是,普通用户(在user中无特殊权限)能不能
操作mysql.tables_priv?本来想自己实验,没想到发生错误,在这里一并问了吧。
grant all on snc.* to test identified by 'try';
在授权表中将会产生一个Host = %
User = test
Password = ***的用户授权信息,而你通过 mysql -u test -ptry 登录时,却不会匹配这条用户信息
而是匹配你的用户授权表中的 Host = localhost
User = 空
Password = 空的用户信息为什么会匹配这一条呢, 呵呵,看一看 MySQL 中对用户权限表的排序吧!!!
你的第二个问题其它我在上次已回答过了,
GRANT SELECT (Host,Db,User,Table_Name)
ON mysql.tables_priv
TO test@localhost
IDENTIFIED BY 'test';