我有一个名为project1的数据库,其中包含以下表格:
_systbl1
_systbl2
_systbl3
dataset1
dataset2
dataset3
每当添加新用户时,都需要为数据集%表授予MySQL用户odbc的SELECT权限。
为了实现这一点,我使用了一个简单的python脚本,如下所示:
#!/usr/bin/python
import MySQLdb
db = MySQLdb.connect(
host="localhost",
user="user",
passwd="pass",
db="project1"
)
# Create Cursor Object
cur = db.cursor()
# get list of tables beginning with dataset
cur.execute("SHOW TABLES FROM project1 LIKE 'dataset%';")
# run GRANT statement for each table
for row in cur.fetchall() :
cur.execute("GRANT SELECT ON `project1`.`%s` TO `odbc`@`localhost`;", row)
cur.execute("GRANT SELECT ON `project1`.`%s` TO `odbc`@`%`;", row)
不幸的是,它给了我以下错误:
Traceback (most recent call last):
File "mysql_query.py", line 20, in <module>
cur.execute("GRANT SELECT ON `project1`.`%s` TO `odbc`@`localhost`;", row)
File "/usr/lib/python2.7/dist-packages/MySQLdb/cursors.py", line 174, in execute
self.errorhandler(self, exc, value)
File "/usr/lib/python2.7/dist-packages/MySQLdb/connections.py", line 36, in defaulterrorhandler
raise errorclass, errorvalue
_mysql_exceptions.ProgrammingError: (1146, "Table 'project1.'dataset1'' doesn't exist")
正如您在错误的最后一行中所看到的,问题是python在生成查询时在表名周围放置一个引号。
我在这里缺少什么?
答案 0 :(得分:2)
不要对表名使用SQL参数。 SQL参数由数据库适配器转义,不会被解释为除文字值之外的任何内容。
您必须自己插入这些内容,但绝对确定您的表名不包含不受信任的数据(防止SQL注入攻击):
cur.execute("GRANT SELECT ON `project1`.`%s` TO `odbc`@`localhost`;" % row)
cur.execute("GRANT SELECT ON `project1`.`%s` TO `odbc`@`%%`;" % row)
(授权中的%
字符已将其加倍转换为%%
)。
答案 1 :(得分:1)
改为使用:
cur.execute("GRANT SELECT ON `project`.`%s` TO `odbc`@`localhost`" % row)
这不会使用输入的正常转义。但请注意你的任何表名中的反引号。
答案 2 :(得分:1)
sql = """CREATE TABLE IF NOT EXISTS `""" + project + """` ( `id` INT(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`id`))"""