[MySQL#14] 视图 | 用户管理 | 权限设置

目录

一. 视图

1. 什么是视图?

2. 基本使用

1. 语法

2. 示例

数据同步实验

3. 视图规则和限制

二. 用户管理

1. 用户信息

2. 创建用户

3. 删除用户

4. 修改用户密码

5. 数据库的权限

5.1 给用户授权

5.2 回收权限

总结


一. 视图

1. 什么是视图?
  • 定义:视图是一个虚拟表,其内容由查询定义。
  • 结构:同真实的表一样,视图包含一系列带有名称的列和行数据。
  • 意义:基于常用的条件查询建立为视图,方便查看与调用,可以理解为一种对常用的显示
  • 非持久化:视图的数据不会持久化到磁盘上,而是基于查询结果动态生成。
  • 数据同步:视图的数据变化会影响到基表,基表的数据变化也会影响到视图。
2. 基本使用
1. 语法
  • 创建视图
create view 视图名 as select语句;
  • 删除视图
drop view 视图名;
2. 示例
  • 创建视图
create view myview as select ename,dname from emp inner join dept on emp.deptno=dept.deptno;

  • 查询视图
select * from myview;

输出:

数据同步实验
  • 修改视图
update v_ename_dname set ename='TEST' where ename='CLARK';
  • 查询基表
select * from EMP where ename='CLARK';
select * from EMP where ename='TEST';
  • 修改基表
mysql> update EMP set deptno=10 where ename='JAMES'; -- 修改基表
  • 查询视图视图中的数据也发生了变化
mysql> select * from v_ename_dname where ename='JAMES';
+-------+----------+
| ename | dname    |
+-------+----------+
| JAMES | RESEARCH | <== 视图中的数据也发生了变化
+-------+----------+
3. 视图规则和限制
  • 命名:与表一样,必须唯一命名(不能出现同名视图或表名)。
  • 数量:创建视图数目无限制,但要考虑复杂查询创建为视图之后的性能影响。
  • 索引和触发器视图不能添加索引,也不能有关联的触发器或者默认值。
  • 安全性:视图可以提高安全性,必须具有足够的访问权限。
  • 排序order by 可以用在视图中,但如果从该视图检索数据 select 中也含有 order by,那么该视图中的 order by 将覆盖原 select 中的 order by就近原则)。
  • 使用视图可以和表一起使用,如:笛卡尔积、内连、外连等。

二. 用户管理

目前为止我们使用mysql都是用的root账号,但是不建议直接使用root进行mysql的操作。

我们推荐使用普通用户对数据的访问。而root作为管理员可以对普通用户对应的权限进行设置和管理。

如给张三和李四这样的普通用户权限设定后。就只能操作给你权限的库了。

1. 用户信息

MySQL 有自己的用户管理机制,用户信息以表结构形式存储。这些信息保存在系统数据库 mysqluser 表中。

常用的 :

  • User:用户名
  • Host:允许用户从哪台机器登录 MySQL,localhost 表示只允许从本地登录。
  • authentication_string:用户的密码
  • password_expired:密码是否过期
  • password_last_changed:密码上次更改的时间

查看用户信息:

select user, host, authentication_string from user;

  • mysql和linux一样可以允许创建多个用户,这些用户都是普通用户,你可以给他们开账号
  • 所谓在mysql内部给用户开账号,就是把用户的用户名,允许从哪里登录,以及用户的密码信息放在mysql中的user表里。然后就有了这个用户了。
  • 如果我们现在想在mysql新建一个用户,有一个特点简单粗暴的方式,也不用后面学的专门的创建用户的sql语句。
  • 可以用insert 向这个user里面插入也是可以的。但是这太麻烦了。
  • 其实未来学的创建用户,删除用户,修改用户其实说到底就是在user表里做增加删除修改!

2. 创建用户

创建用户的基本语法:

create user '用户名'@'登陆主机/ip' identified by '密码';
  • 用户名:自定义
  • 登陆主机/ip:本机登录用 localhost127.0.0.1,远程登录用 % 表示任意主机。
  • 密码:设置用户密码,会被哈希加密保存到 user 表中。

❗ 报错处理:

编辑 MySQL 配置文件:

通常配置文件位于 /etc/my.cnf 。打开配置文件并查找 [mysqld] 部分。

sudo vi /etc/my.cnf

移除 --skip-grant-tables 选项:

重启:sudo systemctl restart mysql

示例:

create user 'zhangsan'@'localhost' identified by 'password123';
create user 'lisi'@'%' identified by 'password123';

创建用户后,刷新权限以确保用户信息生效:

flush privileges;

3. 删除用户

删除用户的基本语法:

drop user '用户名'@'主机名';

示例:

drop user 'zhangsan'@'localhost';
drop user 'lisi'@'%';
4. 修改用户密码
  • 用户自己修改密码
set password=password('新的密码');
  • root 用户修改指定用户的密码
set password for '用户名'@'主机名' = password('新的密码');

示例:

set password for 'zhangsan'@'localhost' = password('newpassword123');

ERROR 1064 (42000): You have an error in your SQL syntax 错误是因为在 MySQL 8.0 及以上版本中,PASSWORD() 函数已经被弃用。你需要使用新的语法来设置用户密码

在 MySQL 8.0 及以上版本中,可以使用 ALTER USER 语句来设置用户密码

对于远端链接的一些碎碎念:

mysql 暴露到公网上十分的不建议和不安全,博主尝试用两台机器去尝试连接了,有一台是朋友的,可能是哪里权限没打开,危险的事情大概明白思路就好啦,就不尝试了

5. 数据库的权限

当我们在MySQL中把一个用户创建好了,不是就所有工作做好了,而是说把用户创建好了 ,用户还要有他对应的权限也要处理的。

MySQL数据库提供的权限列表:

当前新建的用户只能看到这 两个数据库。

下面给新建用户授权,对新用户做相关限制。

5.1 给用户授权

授权的基本语法:

grant 权限列表 on 库.对象名 to '用户名'@'登陆位置' [identified by '密码'];
  • 权限列表:多个权限用逗号分隔
    • grant select on ...
    • grant select, delete, create on ...
    • grant all [privileges] on ... – 表示赋予该用户在该对象上的所有权限
  • 库.对象名:指定数据库和对象(表、视图、存储过程等)
    • *.*:所有数据库的所有对象
    • 库.*:某个数据库中的所有对象

示例:

grant select, insert, update on mydb.* to 'zhangsan'@'localhost';

查看用户权限:

show grants for 'zhangsan'@'localhost';

5.2 回收权限

回收权限的基本语法:

revoke 权限列表 on 库.对象名 from '用户名'@'登陆位置';

示例:

revoke insert on mydb.* from 'zhangsan'@'localhost';

总结
  • 用户管理:MySQL 通过 user 表管理用户信息。
  • 创建用户:使用 create user 语句创建用户。
  • 删除用户:使用 drop user 语句删除用户。
  • 修改密码:使用 set password 语句修改用户密码。
  • 权限管理:使用 grantrevoke 语句为用户授予权限和回收权限。

通过这些操作,可以有效地管理 MySQL 用户及其权限,确保系统的安全性和数据的完整性~

<think>嗯,我现在需要给用户授权MySQL视图访问权限,但不太确定具体怎么做。首先,我应该了解一下MySQL中的权限系统。用户权限是通过GRANT语句来管理的,对吧?我记得GRANT可以授予各种权限,比如SELECT、INSERT、UPDATE等。但这里只需要用户能访问视图,不能访问基表。那问题来了,如何只授权视图而不授权基表呢? 可能我需要先创建视图,然后给用户授予该视图的SELECT权限。不过,用户是否有权限访问视图所基于的表呢?比如,如果视图是基于表A和表B创建的,用户如果没有这些表的权限,还能通过视图查询吗?这时候可能需要确认,访问视图是否需要基表的权限。之前好像听说过,在MySQL中,如果用户视图权限,即使没有基表的权限,也能通过视图查询数据。但不确定是否正确,可能需要验证一下。 假设用户不需要基表的权限,那么步骤应该是这样的:首先创建视图,然后创建一个用户,接着用GRANT语句授予该用户视图的SELECT权限。同时,确保用户没有其他权限,尤其是基表的SELECT权限。这样用户就只能通过视图访问数据,而无法直接查询或修改基表。 不过,也有可能MySQL在访问视图时会检查用户对基表的权限。如果是这样的话,只授权视图的SELECT可能不够,还需要基表的权限。这时候可能需要进一步处理,比如在创建视图时使用SQL SECURITY DEFINER选项,这样视图会以定义者的权限执行,而不用关心调用者的权限。这样即使用户没有基表的权限,只要视图的定义者有权限用户就可以通过视图访问数据。 那么具体步骤可能包括:首先确保视图的定义者(比如root用户)有基表的SELECT权限,然后创建视图时加上SQL SECURITY DEFINER。接着创建用户,并授予该用户视图的SELECT权限,但不授予基表的任何权限。这样用户就可以查询视图,而无需直接访问基表。 接下来需要验证这个流程是否正确。可能需要实际在MySQL中测试一下。创建测试表,创建视图,创建用户授权视图的SELECT,然后尝试用该用户登录并查询视图和基表,看是否只能访问视图。 另外,还要注意权限的刷新问题,使用FLUSH PRIVILEGES命令让权限生效。可能还需要检查用户是否被正确限制,没有其他全局或数据库级别的权限。 总结一下,可能的步骤是: 1. 创建视图,使用SQL SECURITY DEFINER确保权限正确。 2. 创建用户。 3. 使用GRANT SELECT ON view_name TO 'user'@'host'; 4. 确保用户没有基表的权限。 5. 测试用户权限。 这样应该就能实现只授权视图访问权限的目标了。不过需要实际测试确认,避免权限泄露到基表上。</think>在 MySQL 中,若需仅允许用户访问视图(而非基表),需通过权限控制实现。以下是具体步骤和注意事项: --- ### **一、核心思路** 1. **视图权限独立**:用户视图权限与基表权限分离。 2. **最小化授权**:仅授予用户视图的 `SELECT` 权限,禁止直接操作基表。 3. **安全机制**:利用 `SQL SECURITY DEFINER` 属性,绕过用户对基表的权限限制。 --- ### **二、操作步骤** #### **1. 创建视图(关键配置)** ```sql -- 创建视图时指定 DEFINER(如 root 用户) CREATE SQL SECURITY DEFINER -- 以定义者权限执行,绕过调用者权限 VIEW my_view AS SELECT column1, column2 FROM my_table WHERE condition; ``` #### **2. 创建用户** ```sql CREATE USER 'view_user'@'%' IDENTIFIED BY 'your_password'; ``` #### **3. 授予视图权限** ```sql -- 仅授权视图的 SELECT 权限 GRANT SELECT ON your_database.my_view TO 'view_user'@'%'; FLUSH PRIVILEGES; -- 刷新权限生效 ``` #### **4. 验证权限** ```sql -- 检查用户权限(确保无基表权限) SHOW GRANTS FOR 'view_user'@'%'; -- 预期输出示例:GRANT USAGE ON *.* TO 'view_user'@'%' -- GRANT SELECT ON `your_database`.`my_view` TO 'view_user'@'%' ``` #### **5. 测试用户访问** - **允许的操作**: ```sql -- 用户可查询视图 SELECT * FROM your_database.my_view; ``` - **禁止的操作**: ```sql -- 用户无法直接访问基表 SELECT * FROM your_database.my_table; -- 报错:权限拒绝 ``` --- ### **三、注意事项** 1. **`SQL SECURITY` 参数**: - 使用 `DEFINER`(默认值):视图以定义者权限执行,用户无需基表权限。 - 若使用 `INVOKER`,则用户需同时拥有视图和基表的权限,此时需避免此配置。 2. **权限泄露风险**: - 禁止授予用户基表的 `ANY` 权限(如 `GRANT SELECT ON your_database.*`)。 - 定期检查权限:`SHOW GRANTS FOR 'view_user'@'%'`。 3. **视图更新限制**: - 若视图基于多表或复杂逻辑,可能无法直接通过视图更新数据,需单独处理。 --- ### **四、常见问题** #### **Q1:用户能否通过视图插入/更新数据?** - 仅当视图满足可更新条件(如单表简单查询),且用户被授予 `INSERT`/`UPDATE` 权限时允许。 - 授权语句示例: ```sql GRANT INSERT, UPDATE ON your_database.my_view TO 'view_user'@'%'; ``` #### **Q2:如何撤销视图权限?** ```sql REVOKE SELECT ON your_database.my_view FROM 'view_user'@'%'; FLUSH PRIVILEGES; ``` --- 通过以上步骤,可实现 MySQL 用户仅操作视图,保护基表数据安全。建议通过沙箱环境测试验证权限配置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值