【问题标题】:Is `definer` required when creating a stored procedure?创建存储过程时是否需要“定义器”?
【发布时间】:2011-02-09 14:41:06
【问题描述】:

我已将所有 MySQL 程序编写为 root@localhost:

CREATE DEFINER=`root`@`localhost` PROCEDURE `p_add_user`(...)

麻烦的是,当部署到另一台服务器时,我必须将root替换为当前用户,并将localhost替换为当前IP,这很烦人。

有没有什么方法可以编写程序,让想要使用我的数据库和程序的人不必修改每个程序的定义器?

【问题讨论】:

    标签: mysql stored-procedures


    【解决方案1】:

    如 MySQL 文档中所述 here

    CREATE
    [DEFINER = { user | CURRENT_USER }]
    PROCEDURE sp_name ([proc_parameter[,...]])
    [characteristic ...] routine_body
    

    因此,DEFINER 部分不是强制性的,只需 CREATE PROCEDURE 即可。

    【讨论】:

    • 它说“DEFINER 子句确定在触发器激活时检查访问权限时要使用的安全上下文。更多详细信息将在本节后面给出。”因此,当我确定程序仅由特权用户使用时,我可以完全删除整个定义器的东西吗?
    • 是的,我想。我认为当您定义用户的权限时,可以授予/拒绝“执行程序”权限(不确定...)
    • 这会将定义者设置为当前用户。根据 MySQL 文档Access Control for Stored Programs and Views:“所有存储的程序(过程、函数和触发器)和视图都可以具有命名 MySQL 帐户的 DEFINER 属性。如果在存储的程序或视图定义中省略了 DEFINER 属性,默认帐户是创建对象的用户。"
    • 嗨,DEFINER 属性杀死了我...让我知道如何删除它?它会在我创建新程序时自动创建...我正在使用 godaddy 共享主机。
    • 同样的问题,Definer 是个杀手。如何在没有定义器的情况下添加过程?
    【解决方案2】:

    [编辑:更新的参考页面]

    您可以通过在过程主体中(声明后)添加以下语句来指定执行权限:

    SQL SECURITY INVOKER
    

    例子:

    CREATE DEFINER=`root`@`localhost` PROCEDURE `p_add_user`()
    SQL SECURITY INVOKER
    (...)
    

    这样做会应用实际的调用者权限并省略DEFINER 部分(即使它是在模式导入期间自动添加的)。 完整参考这里: https://dev.mysql.com/doc/refman/5.7/en/stored-objects-security.html

    【讨论】:

    • 这应该是答案。它完美地解决了 OP 的问题。
    【解决方案3】:
    CREATE DEFINER=[your_web_user]@% PROCEDURE p_add_user(...)
    

    检查一下。如果您想在程序中定义用户,这可能会对您有所帮助...

    【讨论】:

    • 你能解释一下属性 DEFINER 吗? % 表示 - 它允许来自任何 IP 地址的任何用户?请。回复我。我正在使用自动创建 DEFINER 的 Godaddy 共享主机,我们无法将其删除。它被提到为 DEFINER=[databasename]@% 但它不允许我从本地 Windows 应用程序通信存储过程;但是如果我使用普通查询(例如:select * from tablenm ...),我可以进行交流,任何人都可以在这方面帮助我-拜托。
    猜你喜欢
    • 1970-01-01
    • 2011-01-25
    • 1970-01-01
    • 2015-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多