我有一个包含SQL语句的字符串。我想知道查询是否会修改数据或数据库结构,或者它是否只读取数据。有没有办法做到这一点?
更多信息:在我们的应用程序中,我们需要让用户输入SQL查询,主要是作为应用程序报告系统的一部分。应允许这些SQL查询从数据库中读取他们喜欢的任何内容,但不应允许他们修改任何内容。没有更新,删除插入,表格丢弃,约束删除等。
截至目前,我只测试字符串中的第一个单词是否为“select”,但这太紧凑且太不安全了。
答案 0 :(得分:10)
对于应用程序使用的登录,您应该只授予表的select权限。
答案 1 :(得分:9)
为仅具有select权限的应用程序部分创建新用户。请记住,您还需要为“只读”用户能够查看的所有表/视图创建同义词。
您的应用程序的“常规”部分仍然可以执行其他操作(插入,更新,删除)。只是报告将使用只读用户。
正如Horacio所说,添加“包装”视图也是一个好主意/做法,这些视图只会暴露您想要公开的内容。某种“公共API”。如果您需要更改基础表并且不希望/不能将报告更改为所述表的新定义,这可以为您提供灵活性。然而,这可能被视为许多“额外工作”。
答案 2 :(得分:3)
我同意其他人的说法,正确的做法是使用一个具有有限访问权限的单独架构。那些应该是只读的查询的权限。
然而,另一个选择是在执行用户输入的语句(SET TRANSACTION READ ONLY
)之前将事务设置为只读。
答案 3 :(得分:2)
创建VIEWS以向最终用户公开数据,这是值得的,因为有三件事:
CREATE VIEW items (name, price, tax) AS SELECT name, price, tax_rate FROM item WITH READ ONLY;
答案 4 :(得分:1)
过去对我有用的东西,但可能不适合你的情况:
答案 5 :(得分:1)
SELECT * FROM表FOR UPDATE即使只有SELECT权限也能正常工作,并且仍会造成很大的破坏。如果您想要安全,只读事务会更好。