- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的主要目标是拥有一个可以限制访问权限的数据库用户,这样他们就不会看到一些 secret 内容,同时仍然能够使用外键进行完整性检查。因此,必须允许下面的 foo
用户仅查看 PUBLIC
项,同时仍然能够在其 other_data
表上创建外键,以便该表不会包含他们看不到的任何 id_item
值。
这是设置:
-- These are items with a visibility
CREATE TABLE items (
id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
item_name VARCHAR(50) NOT NULL,
visibility ENUM('PUBLIC','PRIVATE','DELETED') NOT NULL DEFAULT 'PRIVATE',
INDEX (visibility),
UNIQUE INDEX (item_name)
)
ENGINE=INNODB;
INSERT INTO items (id, item_name, visibility)
VALUES (1, 'x', 'PUBLIC'), (2, 'y', 'PRIVATE'), (3, 'z', 'DELETED'), (4, 'xprime', 'PUBLIC'), (5, 'yprime', 'PRIVATE'), (6, 'zprime', 'DELETED');
-- This view only shows the public items (not private ones, not deleted ones)
CREATE VIEW public_items AS
(SELECT id, item_name FROM items WHERE visibility = 'PUBLIC');
-- How can I make this table definition only allow id_item to be a value from public_items.id?
-- I cannot use the view in the constraint, tho it would be perfect solution
CREATE TABLE other_data (
id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
label VARCHAR(50) NOT NULL,
id_item INT UNSIGNED NOT NULL,
UNIQUE KEY (label),
CONSTRAINT FOREIGN KEY (id_item) REFERENCES /*public_*/items (id)
ON UPDATE CASCADE ON DELETE RESTRICT
)ENGINE=INNODB;
-- Let's create the foo user that I want to restrict access rights
CREATE USER 'foo'@'localhost' IDENTIFIED BY 'bar';
GRANT USAGE ON *.* TO 'foo'@'localhost';
GRANT SELECT ON test_sql.public_items TO 'foo'@'localhost';
GRANT SELECT,INSERT ON test_sql.other_data TO 'foo'@'localhost';
FLUSH PRIVILEGES;
-- Now, use foo@localhost user
-- This should return (1;4) because foo must be allowed to see the public items => OK
SELECT * FROM public_items;
-- This should be DENIED because foo is not allowed to see all other items => OK
SELECT * FROM items;
-- This should be ALLOWED because foo is allowed to insert rows in other_data => OK
-- and this row refers to a public item
INSERT INTO other_data (id, label, id_item) VALUES (11, 'allowed-public', 1);
-- This should be ALLOWED because foo is allowed to see all the other_data => OK
SELECT * FROM other_data;
-- This should be FORBIDDEN because the item is not public => FAIL, it can be inserted...
INSERT INTO other_data (id, label, id_item) VALUES (12, 'forbidden-private', 2);
-- This should be FORBIDDEN because the item is not public => FAIL, it can be inserted
INSERT INTO other_data (id, label, id_item) VALUES (13, 'forbidden-deleted', 3);
-- This should be FORBIDDEN because the item does not exist => OK, it cannot be inserted
INSERT INTO other_data (id, label, id_item) VALUES (19, 'forbidden-notexist', 9);
我在这里使用 mysql 5.7,所以我可以在 items
表中使用生成的列,类似于 id_if_public INT UNSIGNED GENERATED ALWAYS AS IF(visibility = 'PUBLIC' , id, NULL) STORED
并将我的 FK 放在该列上,但生成的列禁止引用自动增量 (id
) 列...
我可以迁移到 MySQL 8,以便在 other_data
上使用 CHECK
语法,例如 CHECK EXISTS(SELECT 1 FROM public_items WHERE public_items.id = other_data. id_item)
但似乎 CHECK
不允许子查询...
我可以将 public_items
转换为一个表,并使用 TRIGGER
等“维护”它,但感觉非常沉重和复杂,并且需要额外的存储空间 item_name
因此它不是完全可扩展的(即:items
中的列越多,就越重!)
最佳答案
拥有这样一个新表public_items
并不是一个坏主意,因为您需要有外键的东西。您可以将其与 View 结合起来,从 items
表中获取元信息,这样您就不需要将它们添加到新的 public_items
表中两次。这些表格应如下所示:
CREATE TABLE items (
id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
item_name VARCHAR(50) NOT NULL,
visibility ENUM('PUBLIC','PRIVATE','DELETED') NOT NULL DEFAULT 'PRIVATE',
INDEX (visibility),
UNIQUE INDEX (item_name),
UNIQUE INDEX (id, visibility) /* new index over 'id' and 'visibility' */
);
现在,您创建一个新表 public_items
,其外键位于 (id, Visibility)
上,但强制仅包含 “PUBLIC”
条目可以使用。
CREATE TABLE public_items (
id INT UNSIGNED NOT NULL PRIMARY KEY,
visibility ENUM('PUBLIC') NOT NULL, /* only allow public items */
CONSTRAINT FK_public_items_id_visibility FOREIGN KEY (id, visibility)
REFERENCES items(id, visibility)
);
现在,您只能添加来自 public_items
中的 items
的行,这些行是公共(public)的,并且您可以通过外键引用这些行。您的 other_data
表必须将外键更改为这个新的 public_items
表。
显然这种方法有一些缺点:
items
中的条目维护 public_items
中的公共(public)项目列表。您可以使用触发器或后台进程或任何其他方法来保持这些条目同步。public_items
表没有 item_name
列。如果您不想将这些元信息复制到 public_items
表(使用上面提到的同步/更新过程)。关于mysql - 基于另一个列值 ("foreign key to a view' s 列限制 MySQL 外键”)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59423197/
我正在 csv 上使用 hadoop 来分析一些数据。我使用sql/mysql(不确定)来分析数据,现在陷入了僵局。 我花了好几个小时在谷歌上搜索,却没有找到任何相关的东西。我需要一个查询,在该查询中
我正在为 Bootstrap 网格布局的“简单”任务而苦苦挣扎。我希望在大视口(viewport)上有 4 列,然后在中型设备上有 2 列,最后在较小的设备上只有 1 列。 当我测试我的代码片段时,似
对于这个令人困惑的标题,我深表歉意,我想不出这个问题的正确措辞。相反,我只会给你背景信息和目标: 这是在一个表中,一个人可能有也可能没有多行数据,这些行可能包含相同的 activity_id 值,也可
具有 3 列的数据库表 - A int , B int , C int 我的问题是: 如何使用 Sequelize 结果找到 A > B + C const countTasks = await Ta
我在通过以下功能编写此查询时遇到问题: 首先按第 2 列 DESC 排序,然后从“不同的第 1 列”中选择 只有 Column1 是 DISTINCT 此查询没有帮助,因为它首先从第 1 列中进行选择
使用 Bootstrap 非常有趣和有帮助,目前我在创建以下需求时遇到问题。 “使用 bootstrap 在桌面上有 4 列,在平板电脑上有 2 列,在移动设备上有 1 列”谁能告诉我正确的结构 最佳
我是 R 新手,正在问一个非常基本的问题。当然,我在尝试从所提供的示例中获取指导的同时做了功课here和 here ,但无法在我的案例中实现这个想法,即可能是由于我的问题中的比较维度更大。 我的实
通常我会使用 R 并执行 merge.by,但这个文件似乎太大了,部门中的任何一台计算机都无法处理它! (任何从事遗传学工作的人的附加信息)本质上,插补似乎删除了 snp ID 的 rs 数字,我只剩
我有一个 df , delta1 delta2 0 -1 2 0 -1 0 0 0 我想知道如何分配 delt
您好,我想知道是否可以执行以下操作。显然,我已经尝试在 phpMyAdmin 中运行它,但出现错误。也许还有另一种方式来编写此查询。 SELECT * FROM eat_eat_restaurants
我有 2 个列表(标题和数据值)。我想要将数据值列 1 匹配并替换为头文件列 1,以获得与 dataValue 列 1 和标题值列 2 匹配的值 头文件 TotalLoad,M0001001 Hois
我有两个不同长度的文件,file2 是一个很大的引用文件,我从中提取文件 1 的数据。 我有一行 awk,我通常会对其进行调整以在我的文件中进行查找和替换,但它总是在同一列中进行查找和替换。 所以对于
假设我有两个表,如下所示。 create table contract( c_ID number(1) primary key, c_name varchar2(50) not
我有一个带有 varchar 列的 H2 表,其检查约束定义如下: CONSTRAINT my_constraint CHECK (varchar_field <> '') 以下插入语句失败,但当我删
这是最少量的代码,可以清楚地说明我的问题: One Two Three 前 2 个 div 应该是 2 个左列。第三个应该占据页面的其余部分。最后,我将添加选项来隐藏和
在 Azure 中的 Log Analytics 中,我为 VM Heartbeat 选择一个预定义查询,我在编辑器中运行查询正常,但当我去创建警报时,我不断收到警报“查询未返回 TimeGenera
在 Azure 中的 Log Analytics 中,我为 VM Heartbeat 选择一个预定义查询,我在编辑器中运行查询正常,但当我去创建警报时,我不断收到警报“查询未返回 TimeGenera
今天我开始使用 JexcelApi 并遇到了这个:当您尝试从特定位置获取元素时,不是像您通常期望的那样使用sheet.getCell(row,col),而是使用sheet.getCell(col,ro
我有一个包含 28 列的数据库。第一列是代码,第二列是名称,其余是值。 public void displayData() { con.Open(); MySqlDataAdapter
我很沮丧:每当我缩小这个网页时,一切都变得一团糟。我如何将网页居中,以便我可以缩小并且元素不会被错误定位。 (它应该是 2 列,但所有内容都合并为 1)我试过 但由于某种原因,这不起作用。 www.o
我是一名优秀的程序员,十分优秀!