是否可以使用SQL将可执行代码存储到表记录中

时间:2014-11-07 14:53:34

标签: mysql sql sql-server oracle

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

让我们把这一点放到转移到电子媒体的桌面纸牌游戏的角度。 假设你有4个玩家有20个生命值。

当然,记录将代表一张卡片。 列将是给定卡的数量,每张卡将处理的损坏,用于卡描述的字符串列,以及最后为代表特殊能力的卡的执行代码保留的列。

当玩牌时,任何可执行代码都会影响结果。

2 个答案:

答案 0 :(得分:5)

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

你应该吗?几乎肯定不是。建立这种活力很少值得。它通常会使您的系统更难以理解和调试,因为除了您可能实际看到的代码之外,您现在还有一些代码作为数据。它破坏了各种良好的编程实践(将相关代码的一些部分分开,使其成为正确的代码库,其他部分在表中的行中实现,它不可避免地导致您将方法暴露给您不会#39;如果系统设计得当,等等。)这使得安全性变得更加复杂,因为您基本上在一个精彩的SQL注入漏洞中构建了系统。您确实获得了更大的灵活性,但系统实际上使用这种灵活性足以抵消缺点的情况非常罕见。

答案 1 :(得分:0)

在我看来,您正试图将面向对象的设计原则(封装在一起的数据和功能/方法)应用于关系数据库。如果这是正确的,那么您可以考虑在Oracle中使用PL / SQL包。该包将是表的包装器,提供select / retrieve / insert / update / delete方法或函数,以及其他业务方法,这些方法采用主键值来标识您要操作的对象(卡),然后执行某些操作基于该对象的属性(行的列值)和/或其他参数。据推测,算法在卡与卡之间变化不大,因此无法进行推广和参数化。附带福利,它将是可管理的,编译和缓存以获得最高性能。 PL / SQL不是面向对象的,比如Java或C ++,但它确实支持对象数据属性和相关功能的封装。