【问题标题】:Is it possible to store executable code into a table record using SQL是否可以使用 SQL 将可执行代码存储到表记录中
【发布时间】:2015-01-04 09:37:17
【问题描述】:

这实际上更像是一个“我能做到”的理论问题。是否可以将执行代码存储在表的记录列中。

让我们从转移到电子媒体的桌面纸牌游戏的角度来看。 假设您有 4 名玩家,他们的生命值为 20。

当然,一条记录将代表一张卡片。 列将是给定卡的数量,每张卡将造成的伤害,用于卡描述的字符串列,最后是为代表特殊能力的卡的执行代码保留的列。

当一张牌被打出时,任何可执行代码都会影响结果。

【问题讨论】:

  • 我刚刚抽到了无解大牌
  • 直截了当的问题是问是否可以将可执行代码存储到表列的记录中。
  • 你应该选择你感兴趣的数据库。
  • 通常会存储经过分析和操作的特定值,但这是一个独立的可执行过程。您可以存储某种聚合的元数据或脚本之类的代码,但(imo)仅作为最后的手段。存储某种本机二进制代码会很糟糕。
  • 由什么执行? 可能存储动态 SQL 片段甚至二进制数据,是的,但我不推荐它。

标签: mysql sql sql-server oracle


【解决方案1】:

在我看来,您正在尝试将面向对象的设计原则(封装在一起的数据和功能/方法)应用于关系数据库。如果这是正确的,那么您可能会考虑在 Oracle 中使用 PL/SQL 包。该包将是表格的包装器,提供选择/检索/插入/更新/删除方法或函数,以及其他业务方法,这些方法采用主键值来识别您要操作的对象(卡)然后执行某些操作基于该对象的属性(行的列值)和/或其他参数。据推测,算法在不同卡片之间并没有太大差异,以至于它不能被概括和参数化。附带好处,它将是可管理的、编译的和缓存的,以实现最高性能。 PL/SQL 不像 Java 或 C++ 那样面向对象,但它确实支持对象数据属性和相关功能的封装。

【讨论】:

    【解决方案2】:

    可以吗?大概。在几乎任何数据库系统中,都可以存储可以在运行时动态读取和执行的 PL/SQL(用于 Oracle)、T-SQL(用于 SQL Server)等字符串。

    你应该吗?几乎可以肯定不是。建立这种活力很少值得。它通常会使您的系统更难理解和调试,因为除了您可能实际查看的代码之外,您现在还有一些代码作为数据。它破坏了各种良好的编程实践(将相关代码的一些部分分开,其中一些使其进入适当的代码库,而另一些部分则在表中的行中实现,它不可避免地导致您向世界公开您不会的方法'如果系统设计得当,等等)并且它使安全性变得更加复杂,因为你实际上是在你的系统中构建一个美妙的 SQL 注入漏洞。您确实获得了更多的灵活性,但很少有系统实际上经常使用这种灵活性来抵消缺点。

    【讨论】:

    • 我知道它会破坏任何可以想象到的良好编程习惯。这个想法只是一个假设。坦率地说,我认为它也非常低效,因为它涉及在字符串中插入代码,然后必须解析它。但是,根据应用程序的不同,这种做法可能会有一些用处。
    猜你喜欢
    • 2021-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多