为什么不建议以编程方式更改 table 结构?
why is not adviced to change table structure programatically?
一般而言,应用程序用户不应该拥有 DDL 权限。
我一直在寻找这个原因,但找不到任何东西。
我能理解这种设计可能存在锁定问题,但想阅读更多相关细节。
任何人都可以解释或指出任何关于此的文章吗?
非常感谢!!
Generally, application user is not supposed to have DDL rights. I was searching for the reason for this but could not find anything.
Creating/Altering table 不是即时完成的。您创建它们一次,并且只能通过应用程序操作数据(使用 PL/SQL 存储的对象)。数据库设计不应经常更改,即 应用程序用户 不应 add/alter/drop 数据库对象。它应该由 数据库用户 (需要 privilege/role)而不是应用程序用户完成。
应用程序应该只执行 DML 而不是 DDL。应用程序用户应该只能操作数据,而不能操作存储数据的对象本身。
想象一个有多个用户的数据库,每个用户在没有其他用户 knowledge/consent 的情况下执行 DDL 操作。其他用户将如何工作?基于数据库设计的功能呢?基于数据库设计的应用逻辑呢?每个生产系统都有一个针对此类更改的发布日历,这是不应该经常进行的事情。
"never use DDL in businesses logic" - 这是 Oracle 的经验法则。
- DDL 不缩放
- DDL 需要独占锁,可能会在 DDL 执行超时时死掉
- DDL不可回滚(不支持事务)
- DDL 使执行计划无效
- DDL 可能需要重新编译 PL/SQL 代码
您通常不希望这种情况发生在工作时间。
一般而言,应用程序用户不应该拥有 DDL 权限。 我一直在寻找这个原因,但找不到任何东西。
我能理解这种设计可能存在锁定问题,但想阅读更多相关细节。
任何人都可以解释或指出任何关于此的文章吗?
非常感谢!!
Generally, application user is not supposed to have DDL rights. I was searching for the reason for this but could not find anything.
Creating/Altering table 不是即时完成的。您创建它们一次,并且只能通过应用程序操作数据(使用 PL/SQL 存储的对象)。数据库设计不应经常更改,即 应用程序用户 不应 add/alter/drop 数据库对象。它应该由 数据库用户 (需要 privilege/role)而不是应用程序用户完成。
应用程序应该只执行 DML 而不是 DDL。应用程序用户应该只能操作数据,而不能操作存储数据的对象本身。
想象一个有多个用户的数据库,每个用户在没有其他用户 knowledge/consent 的情况下执行 DDL 操作。其他用户将如何工作?基于数据库设计的功能呢?基于数据库设计的应用逻辑呢?每个生产系统都有一个针对此类更改的发布日历,这是不应该经常进行的事情。
"never use DDL in businesses logic" - 这是 Oracle 的经验法则。
- DDL 不缩放
- DDL 需要独占锁,可能会在 DDL 执行超时时死掉
- DDL不可回滚(不支持事务)
- DDL 使执行计划无效
- DDL 可能需要重新编译 PL/SQL 代码
您通常不希望这种情况发生在工作时间。