当前位置: 首页 > news >正文

MySQL:用户权限和语言接口

1. 视图

视图是一个不怎么重要不怎么常用的机制。

视图是一个虚拟表,其内容由查询定义。视图和真实的表一样,包含一系列带有名称的列和行数据,

1.1 基本使用

create view `view_name` as select ...;

创建视图就相当于创建一张表,并且也以文件的形式保存在MySQL目录中。

但文件只保存了结构没保存数据,每次查看视图都会临时从表中获取数据。这样有个好处是视图的数据变化会影响到基表,基表的数据变化也会影响到视图。

1.2 视图规定和限制

  • 与表一样,必须唯一命名(不能出现同名视图或表名)
  • 创建视图数目无限制,但要考虑复杂查询创建为视图之后的性能影响
  • 视图不能添加索引,也不能有关联的触发器或者默认值
  • 视图可以提高安全性,必须具有足够的访问权限
  • order by 可以用在视图中,但是如果从该视图检索数据 select 中也含有 order by,那么该视图中的 order by 将被覆盖

 

2. 用户管理

用户管理的思路都是大同小异,可以类比Linux用户管理。

2.1 用户信息

MySQL中用户信息都在库mysql的user表中。

字段解释
host这个用户的允许登陆地,如果是localhost表示本地,%表示任意
user用户名
authentication_string用户密码通过password函数加密后的结果
*_priv用户拥有的权限,后面跟Y表示允许,N表示拒绝

创建用户

create user 'username'@'ip' identified by 'password';

用户被创建好,也无法进行大部分操作,需要对用户进行赋权。

删除用户

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

修改用户密码

# 自行修改密码
set password=password('新的密码');
# root用户修改其他用户密码
set password for '用户名'@'主机名'=password('新的密码');

2.2 用户权限

权限字段上下文
CREATECreate_priv数据库、表或索引
DROPDrop_priv数据库、表
GRANT OPTIONGrant_priv数据库、表或保存的程序
REFERENCESReferences_priv数据库或表
ALTERAlter_priv
DELETEDelete_priv
INDEXIndex_priv
INSERTInsert_priv
SELECTSelect_priv
UPDATEUpdate_priy
CREATE VIEWCreate_view_priy视图
SHOW VIEWShow_view_priv视图
ALTER ROUTINEAlter_routine_priy保存的程序
CREATE ROUTINECreate_routine_priv保存的程序
EXECUTEExecute_priv保存的程序
FILEFile_priv服务器主机上的文件访问
CREATE TEMPORARY TABLESCreate_tmp_table_priv服务器管理
LOCK TABLESLock_tables_priv服务器管理
CREATE USERCreate_user_priv服务器管理
PROCESSProcess_priv服务器管理
RELOADReload_priv服务器管理
REPLICATION CLIENTRepl_client_priv服务器管理
REPLICATION SLAVERepl_slave_priv服务器管理
SHOW_DATABASESShow_db_priy服务器管理
SHUTDOWNShutdown_priy服务器管理
SUPERSuper_priv服务器管理

用户赋权

grant 权限列表 on.对象名 to '用户名'@'登陆IP' [ identified by '密码' ];

赋权之后如果没反应,需要进行刷新权限:

flush privileges;

如果嫌麻烦的话可以直接把权限列表写成all

grant all on *.* to '用户名'@'登陆IP';

回收权限

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

 

3. C语言接口使用

安装环境

要想使用C/C++的MySQL接口,必须使用MySQL提供的库。如果当初是用yum安装MySQL的直接就有。

如果没有目录/usr/include/mysql,可以安装如下两个程序

$ yum install -y libodb-mysql-devel.x86_64
$ yum install -y soci-mysql-devel.x86_64 

链接静态库的时候,要指明库名和路径。

mysql_test:mysql_test.cc
        g++ -o $@ $^ -lmysqlclient -L/usr/lib64/mysql -std=c++11

这里有一个坑,库所在路径一定要指明/usr/lib64/mysql,如果找不到的话。

3.1 接口介绍

创建关闭句柄

//0. 创建MYSQL句柄
MYSQL* my = mysql_init(nullptr);
//4. 关闭数据库
mysql_close(my);

由此也可以看出MySQL其实是网络服务,句柄就是文件描述符。

连接数据库

//1. 连接MYSQL
char* host   = "127.0.0.1";
char* user   = "test";
char* passwd = "TESTtest123456!";
char* db     = "102_db";
char* port   = 3306;

if (mysql_real_connect(my, host, user, passwd, db, port, nullptr, 0) == nullptr) {
    std::cout << "connect failed" << std::endl;
    exit(1);
}
std::cout << "connect success" << std::endl;

设置字符编码

//2. 设置字符编码
mysql_set_character_set(my, "utf8");

设置字符编码为utf8,防止乱码。

执行SQL语句

//3. 执行SQL语句
// 增删改
std::string sql = "insert into account values (5, '猪八戒', 8.22)";
std::string sql = "delete from account where id=5";
std::string sql = "update account set name='唐僧' where id=5";
// 查
std::string sql = "select * from account";

int res = mysql_query(my, sql.c_str());
if (res != 0) {
    std::cout << "execute: " << sql << " failed" << std::endl;
    exit(2);
}

传入SQL语句,返回值为0表示成功,为1表示失败。

增删改SQL执行完就完了,如果是查询select语句我们还要读取结果。

获取查询结果

// 获取执行结果
MYSQL_RES* result = mysql_store_result(my);

依靠句柄获取最新一次查询结果,返回到MYSQL_RES结构体中。

同时该函数malloc了一块内存空间来存储查询过来的数据,所以一定要释放对应空间不然会造成内存泄漏。

获取行数列数

// 获取行数列数
int rows = mysql_num_rows(result);
int cols = mysql_num_fields(result);
std::cout << "行数: " << rows << " 列数: " << cols << std::endl;

获取字段名称

// 获取字段名称
MYSQL_FIELD* fields = mysql_fetch_fields(result);
for (int i = 0; i < cols; i++) {
    std::cout << fields[i].name << "\t";
}
std::cout << std::endl;

获取一行记录

//遍历获取记录
for (int i = 0; i < rows; i++) {
    MYSQL_ROW line = mysql_fetch_row(result);
    for (int j = 0; j < cols; j++) {
        std::cout << line[j] << "\t";
    }
    std::cout << std::endl;
}

mysql_fetch_row返回值就是一个char*的数组,保存的是一条记录中的每个字段值。

相关文章:

  • 2022年广西壮族自治区中职网络安全技能竞赛“Linux操作系统渗透测试详解”
  • 沉睡者 - 抖音中视频计划横版16:9视频制作教程
  • 强大的包管理器Poetry
  • MFC Windows 程序设计[304]之文件夹的枚举(附源码)
  • 【ArcGIS微课1000例】0033:地图点状标记符号设计教程
  • 神经网络中的算法-BN算法
  • SpringBoot接收参数的几种常用方式
  • Linux--权限
  • ESP32上手指南
  • 多径信道下通过LMS均衡算法提高通信质量——详细版
  • 前端笔试/面试题
  • 基于C51语音控制小车
  • 算法优化 | MATLAB实现BO-RF贝叶斯优化随机森林算法
  • C# 中的多线程
  • 【C++】类和对象(下)—— 再谈构造函数 | static成员 | C++11补丁 |友元
  • 《剑指offer》分解让复杂问题更简单
  • 「面试题」如何实现一个圣杯布局?
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • ES6 ...操作符
  • extjs4学习之配置
  • HTML中设置input等文本框为不可操作
  • Java教程_软件开发基础
  • MySQL-事务管理(基础)
  • windows下如何用phpstorm同步测试服务器
  • 编写符合Python风格的对象
  • 成为一名优秀的Developer的书单
  • 浅谈Kotlin实战篇之自定义View图片圆角简单应用(一)
  • 数组的操作
  • 微信开放平台全网发布【失败】的几点排查方法
  • 文本多行溢出显示...之最后一行不到行尾的解决
  • 一个6年java程序员的工作感悟,写给还在迷茫的你
  • Linux权限管理(week1_day5)--技术流ken
  • ​​​​​​​sokit v1.3抓手机应用socket数据包: Socket是传输控制层协议,WebSocket是应用层协议。
  • ​业务双活的数据切换思路设计(下)
  • # 20155222 2016-2017-2 《Java程序设计》第5周学习总结
  • # Python csv、xlsx、json、二进制(MP3) 文件读写基本使用
  • #Java第九次作业--输入输出流和文件操作
  • #考研#计算机文化知识1(局域网及网络互联)
  • #控制台大学课堂点名问题_课堂随机点名
  • $().each和$.each的区别
  • (板子)A* astar算法,AcWing第k短路+八数码 带注释
  • (初研) Sentence-embedding fine-tune notebook
  • (动手学习深度学习)第13章 计算机视觉---图像增广与微调
  • (附源码)python房屋租赁管理系统 毕业设计 745613
  • (附源码)springboot建达集团公司平台 毕业设计 141538
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理第3章 信息系统治理(一)
  • (转)MVC3 类型“System.Web.Mvc.ModelClientValidationRule”同时存在
  • (转)菜鸟学数据库(三)——存储过程
  • ****** 二 ******、软设笔记【数据结构】-KMP算法、树、二叉树
  • ****Linux下Mysql的安装和配置
  • . Flume面试题
  • .apk文件,IIS不支持下载解决
  • .NET单元测试
  • .NET委托:一个关于C#的睡前故事
  • /bin/rm: 参数列表过长"的解决办法