我想执行这样的事情:
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>;
或者这是错误的做法?此外,它不是“更新特定记录中的特定字段”问题的一般解决方案。
答案 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;