我一直在为一个一次性项目运行一个小型 MySQL 数据库,并将该文件转储给一位同事,他能够让一切运行起来。
我们正在使用 C#,并运行两个查询,其中之一是:
SELECT * FROM someview LIMIT 20 OFFSET 0;
另一个是:
SELECT COUNT(*) FROM someview;
我将使用 SELECT SQL_CALC_FOUND_ROWS * 和 FOUND_ROWS(),但这显然不受 MySQLDataReader 存储过程之外的支持。
无论如何,问题是,这两个查询在我的系统上都可以正常工作。在他身上,第一个工作得很好,但是 SELECT COUNT(*) 语句失败并出现以下错误:
Error Code: 1356. View 'db.someview' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them
我们检查了 SHOW GRANTS 的结果,并且具有相同的权限,都以相同的用户(root)运行。这不是 C# 问题,因为如果他在 MySQL 命令行或 Workbench 中运行它,就会发生完全相同的事情。
他还能够成功地针对数据库中的任何其他表或视图发出 SELECT COUNT(*) 查询,包括第一个视图所依赖的视图。这只是一个特殊的视图,他可以选择 *,但不能选择 COUNT(*)。
有没有其他人经历过类似的事情?
服务器版本:5.5.29 MySQL 社区服务器(GPL)
编辑:这里是两个视图创建脚本,根据Evan Miller 的 How Not To Sort By Average Rating,精简到仍然存在问题的相关部分。
CREATE VIEW
product_rating_counts
AS
SELECT
p.id AS productId,
sum(case when (r.rating = 1) then 1 else 0 end) AS 1_star,
sum(case when (r.rating = 2) then 1 else 0 end) AS 2_star,
sum(case when (r.rating = 3) then 1 else 0 end) AS 3_star,
sum(case when (r.rating = 4) then 1 else 0 end) AS 4_star,
sum(case when (r.rating = 5) then 1 else 0 end) AS 5_star,
sum(case when (r.rating < 3) then 1 else 0 end) AS negative_ratings,
sum(case when (r.rating > 3) then 1 else 0 end) AS positive_ratings,
sum(case when (r.rating = 3) then 1 else 0 end) AS neutral_ratings
FROM
product p
INNER JOIN
review r
ON
p.id = r.productId
GROUP BY
p.id;
CREATE VIEW
ranked_products
AS
SELECT
p.id AS ID,
p.SKU AS SKU,
p.Name AS Name,
prc.1_star,
prc.2_star,
prc.3_star,
prc.4_star,
prc.5_star,
prc.positive_ratings AS Positive,
prc.negative_ratings AS Negative,
prc.neutral_ratings AS Neutral,
((prc.positive_ratings + 1.9208) / (prc.positive_ratings + prc.negative_ratings) -
1.96 * SQRT((prc.positive_ratings * prc.negative_ratings) / (prc.positive_ratings + prc.negative_ratings) + 0.9604) /
(prc.positive_ratings + prc.negative_ratings)) / (1 + 3.8416 / (prc.positive_ratings + prc.negative_ratings))
AS ci_lower_bound
FROM
product p
INNER JOIN
product_rating_counts prc
ON
p.id = prc.productId
WHERE
(prc.positive_ratings + prc.negative_ratings) > 0
ORDER BY
ci_lower_bound DESC;
所以对我有用的是:
SELECT * FROM ranked_products LIMIT 20 OFFSET 0;
SELECT COUNT(*) FROM ranked_products;
但是对于我的同事来说,第一个查询返回得很好,而第二个给他无效的表/列/权限错误。
无论如何,我们可能会放弃这个,但我讨厌不知道为什么有些东西不起作用。