mariadb 状态明智 where case 子句在视图中

问题描述

我在协作表中创建了以下视图

CREATE VIEW contents(
  id,title
)
AS
select 
   mytable.id as id,mytable.title as title
from mytable 
where mytable.owner = substring_index(user(),'@',1);

有什么方法可以检测视图内部的当前状态,例如 where 子句中的 select,insert,update,delete 吗?

我希望像下面这样,不知道如何在 MysqL/mariadb 中生成等价物

/* during select statement user can see all available data*/
if state == 'select' then
    where 1 = 1 /* can see all data */
else
/* if state is update or delete user is allowed to modify or delete data which for which he/she is owner*/
    where mytable.owner = substring_index(user(),1);
endif

Here is my sample data

MariaDB [test]> select * from mytable;
+----+-------------------+-------+
| id | title             | owner |
+----+-------------------+-------+
|  1 | created by root   | root  |
|  4 | created by helen  | helen |
|  6 | created by helen1 | helen |
|  7 | 123               | lina |
+----+-------------------+-------+

用户 helen 和 lina 拥有 SELECT,INSERT,UPDATE,DELETE内容视图授权

  • 用户helen也是普通用户如何授予创建new_database的权限,并继承new_database中helen创建的任何新表的权限?我不想以管理员身份创建海伦。用户 helen 应该能够在她创建的数据库中创建任意数量数据库和表。这是否可能?
   new_database
         table1
         table2
         .....
         .....
         tableN

解决方法

因为 check constrants 不能使用 user。您可以使用 TRIGGERS 来强制执行 fiddle 之类的约束:

插入:

CREATE TRIGGER enforce_insert
BEFORE
INSERT ON mytable
FOR EACH ROW
  IF NEW.owner != substring_index(user(),'@',1) THEN
    SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'conflict of owner on insert';
  END IF

更新:

CREATE TRIGGER enforce_update
BEFORE
UPDATE ON mytable
FOR EACH ROW
  IF OLD.owner != substring_index(user(),1)
     OR NEW.owner != substring_index(user(),1) THEN
    SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'conflict of owner on update';
  END IF

删除:

CREATE TRIGGER enforce_delete
BEFORE
DELETE ON mytable
FOR EACH ROW
  IF OLD.owner != substring_index(user(),1) THEN
    SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'conflict of owner on delete';
  END IF

但通常建议应用程序强制执行数据结构的示意图。

参考:trigger manual

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...