【问题标题】:Check if you can INSERT into MySQL database检查是否可以插入 MySQL 数据库
【发布时间】:2020-01-24 19:04:22
【问题描述】:

假设我正在使用的数据库崩溃或有任何其他错误阻止我在其上调用INSERT。之后,我想知道何时返回对数据库的访问。我想要做的是检查我们是否可以每隔x 秒访问一次(为简单起见 - 每 1 秒一次)。我不想重复该指令 - 我只需要知道数据库是否可用。

请记住 - 我不仅需要知道数据库是否已启动。我还需要知道我们是否有权使用它,以及 - 总的来说 - 我们是否有权在特定表上调用 INSERT

如何使用 Java 以最简洁(一般来说 - 代码量最少)的方式做到这一点?目前我正在使用 Spring 的JpaRepository

【问题讨论】:

  • 我们的做法是在一个线程中进行select 查询
  • select 不会告诉你是否可以insert 进入表格。我们还需要知道我们是否拥有insert 的权限
  • @dan1st 你的意思是 - 尝试每 1 秒insert?当它成功时 - 删除我们插入的记录?对于可能成为性能杀手的更大查询
  • stackoverflow.com/q/8471420/10871900 的可能重复项(jdbc 也适用于 jpa)
  • @Rasmond :您对表的权限是否也会在运行时发生变化?如果不是,我建议您可以先检查一下并将其存储在全局范围内。

标签: java mysql spring


【解决方案1】:

如果您事先知道这是一个表级授权,您可以查询 information_schematable_privileges 表:

select * from table_privileges where privilege_type = 'INSERT';

如果是模式级授权使用:

select * from schema_privileges where privilege_type = 'INSERT';

无论如何,正确的做法是从根本上解决问题。一旦您对表具有插入权限,您就不必担心失去它们,除非是故意撤销。为什么补助金消失了?这很奇怪,因为赠款是持久的。

【讨论】:

  • 它似乎并没有真正起作用。 information_schema.table_privileges 为空
  • 那么插入权限可以在答案中提到的另一个表上找到。 schema_privileges 应该包含一条带有用户名、权限类型和数据库名称的记录。该表是用户对数据库具有插入权限的模式/数据库的一部分。*(该数据库的所有表)
  • 答案中的查询不够详细,它们只是显示在哪里查找插入授权信息,而没有有效地尝试插入记录以了解您是否可以实际插入。
  • IS_GRANTABLE 当前是 NO 对于每个特权
  • 我猜 IS_GRANTABLE 的意思是“用户可以将权限授予其他用户”。您需要知道用户是否可以插入某个表。如果 schema_privileges 有一行包含 db 名称、您用于连接的用户和插入权限,那么您可以进行插入。
猜你喜欢
  • 2021-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-12
  • 2013-05-24
  • 1970-01-01
  • 2015-09-22
相关资源
最近更新 更多