我一直在开发一个允许用户编写自己的查询的平台,我正在考虑使用存储过程进行行级访问。这是它的工作方式;用户使用存储过程调用查询,过程将检查它是否有权访问行,并在通过检查时返回结果。这是我遇到问题的部分的简化版本。
你们可以复制并粘贴这段代码,看看我的意思。
CREATE TABLE student_tests (
name CHAR(10), test CHAR(10),
score TINYINT, test_date DATE
);
INSERT INTO student_tests
(name, test, score, test_date) VALUES
('Chun', 'SQL', 75, '2012-11-05'),
('Chun', 'Tuning', 73, '2013-06-14'),
('Esben', 'SQL', 43, '2014-02-11'),
('Esben', 'Tuning', 31, '2014-02-09'),
('Kaolin', 'SQL', 56, '2014-01-01'),
('Kaolin', 'Tuning', 88, '2013-12-29'),
('Tatiana', 'SQL', 87, '2012-04-28'),
('Tatiana', 'Tuning', 83, '2013-09-30');
DELIMITER //
CREATE or REPLACE PROCEDURE proc1 (IN qry LONGTEXT)
NOT DETERMINISTIC
READS SQL DATA
SQL SECURITY DEFINER
BEGIN
EXECUTE IMMEDIATE CONCAT("create or replace temporary table tab1 as (",qry,");");
SELECT * from tab1;
END
//
DELIMITER ;
#this works perfectly
call proc1 ("select * from student_tests");
#it doesnt work when I try to select columns
## Unknown column 'db.tab1.score' in 'field list'
call proc1 ("select name,test from student_tests");
我认为这与存储过程中的行SELECT * from tab1;
有关。有人可以告诉我发生了什么事吗?我认为我不能正确理解临时表/存储过程。