• MySQL:用户权限和语言接口


    1. 视图

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

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

    1.1 基本使用

    create view `view_name` as select ...;
    
    • 1

    创建视图就相当于创建一张表,并且也以文件的形式保存在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';
    
    • 1

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

    删除用户

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

    修改用户密码

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

    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 '密码' ];
    
    • 1

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

    flush privileges;
    
    • 1

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

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

    回收权限

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

     

    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 
    
    • 1
    • 2

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

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

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

    3.1 接口介绍

    创建关闭句柄

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

    由此也可以看出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;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    设置字符编码

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

    设置字符编码为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);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

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

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

    获取查询结果

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

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

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

    获取行数列数

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

    获取字段名称

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

    获取一行记录

    //遍历获取记录
    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

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

  • 相关阅读:
    mysql5.7.38安装教程
    欢迎使用Markdown编辑器
    springboot16:指标监控(线上指标监控,微服务,高级特性)
    <TypeScript系列>:React 与 TypeScript 的结合
    如何使用 ArrayPool
    YashanDB发布会圆满收官,V23.1三大新品引领国产数据库技术与应用突破!
    深度学习21天——循环神经网络(RNN)实现股票预测 |(第9天)
    Windows11重置提示找不到恢复环境怎么解决?
    Google Analytics优缺点分析
    【无标题】
  • 原文地址:https://blog.csdn.net/yourfriendyo/article/details/127280485