如何在没有SELECT权限的情况下更新特定记录?

时间:2012-01-11 23:19:39

标签: mysql

我想执行这样的事情:

  UPDATE grades SET status="pass" WHERE recno=123;

但是,我希望执行更新的用户帐户具有对数据库的只写访问权限,这意味着它没有SELECT访问权限。这会导致WHERE子句失败。

如果有必要,我实际上可以重写整个记录,但recno是主键,这会导致写入失败。有办法吗

INSERT INTO grades (recno,name,status,...) VALUES (123, 'chemistry', 'pass',...)
  ON DUPLICATE KEY UPDATE <everything>;

或者这是错误的做法?此外,它不是“更新特定记录中的特定字段”问题的一般解决方案。

4 个答案:

答案 0 :(得分:4)

这是保护餐桌的一种特殊方式。在某些情况下,它可能有意义,但通常您希望提供一些可见性窗口,以便用户不会对数据的影响视而不见。

要完全实现只写数据库,请使用存储过程。这些过程可以完全访问数据库,并且只允许用户访问存储过程。

答案 1 :(得分:1)

创建VIEW并授予用户对其的完全访问权限。此视图应仅包含您希望用户能够编辑的行。

另一种可能更合适的方法是将此机制从DBMS中完全抽象出来,而是创建一个允许用户查询的API。

答案 2 :(得分:1)

哦!我懂了。我将仅为recno列提供用户SELECT权限。

保持问题开放,以防有人提出更好的答案。

答案 3 :(得分:0)

通过授予正确的访问级别可以轻松实现这一目标:

REVOKE ALL ON TABLE GRADES FROM USER1; -- to clear out all privileges
GRANT INSERT, UPDATE, DELETE ON TABLE GRADES TO USER1;

这将允许USER1从成绩表中插入,更新和删除,但不能选择。

根据需要将USER1更改为PUBLIC或某些群组或其他任何内容 根据需要更改权限列表。


您的情况是我以前教授的IBM数据库课程中的经典示例的一个版本: 允许财务人员加薪%,但不能员工的工资水平,所以

GRANT UPDATE ON TABLE EMPLOYEE TO ACCT_STAFF; -- an no other privileges

这使他们可以通过执行以下方式增加15%的工资:

UPDATE EMPLOYEE SET PAY = PAY * 1.15 WHERE EMPLOYEE_ID = 666;