由于SQL Server没有软件包,程序员应该采取什么措施来解决它?

问题描述 投票:18回答:9

我有一个SQL Server数据库,该数据库具有大量存储过程。由于Oracle的“打包”功能,大量的存储过程在我的Oracle数据库中不是问题。

程序员如何解决缺少像Oracle那样的“软件包”功能的问题?

sql-server oracle packages
9个回答
25
投票

虽然SQL Server通过封装和包状态的[酷功能]无法提供任何功能[[就像您惯用的,但是您可以将存储的过程组织到架构中。

在企业管理器中,这些过程仍被一起列出,如果您有数百个过程,则这些树会形成巨大的树形列表。我也想念Oracle软件包的组织和出色功能。但是,所有平台都有其优势。

[注意:用.NET语言编写存储过程确实会给您封装和状态。但是,它仍然没有以任何特殊方式在EM树视图中将它们分开。


14
投票
遵循良好的命名约定,使用并执行它。

8
投票
模式可用于组织存储过程和其他对象。就个人而言,当它们按功能区域组织对象以及那些功能区域对应于安全边界时,我更喜欢使用模式。在AdventureWorks示例数据库中可以找到一个示例,该数据库具有“ HumanResources”和“ Sales”之类的架构。从理论上讲,给定用户可能需要访问“ HumanResources”中的对象,但可能不需要访问“ Sales”信息。

一种替代方法是使用命名约定并强制执行,如James所说。我要补充一点,SQL Server Management Studio具有一个过滤器按钮,可用于过滤显示的对象列表。例如,可以单击“存储过程”文件夹,并且名称上的过滤器包含“添加”。

在我当前的项目中,我已经从SSIS包中提取了许多SQL查询,并放入了存储过程中。为了区分这些存储过程和应该通用的存储过程,我在名称前加了“ ssis”。如果我可以在C#或C ++中创建类似于命名空间的内容,并创建“ SSIS.SelectUserLookupData”而不是“ ssis_SelectUserLookupData”,那肯定会更加令人愉快。如果这些命名空间可以嵌套,那就更好了。

如果这是Oracle中Packages的特色之一,那么也许有人会让我知道。


5
投票
我曾经使用过SQL Server和Oracle,因此看到了两者的优缺点。由于上述评论有些激昂,因此我将尽量保持中立...

那么,什么是Oracle软件包?像数据库类一样思考]

该包具有两个元素:头文件和主体文件。头文件是您的公共接口,包含可直接调用的所有存储过程或函数的签名(名称,参数和返回类型(如果适用))(在Oracle中,一个函数返回一个值,一个存储proc不返回)。程序包主体必须在程序包头文件中实现所有过程签名。

包的body元素包含实际完成工作的所有存储的proc和逻辑。您可能在包头中声明了一个Save过程,该过程调用主体中存在的插入或更新proc。开发人员只能看到“保存”过程。重要的是要记住,程序包主体还可以实现未在程序包头中声明的proc或函数,它们仅在程序包本身之外不可访问。

由于多种原因,我发现软件包确实非常有用:

    您已经有了可以提供给其他开发人员的公共接口的概念
  1. 包可以镜像您编译的类。我的Orders.Save()C#方法将调用我的Oracle Orders.SaveLineItem方法来保存每个订单项,并调用Oracle SaveOrder方法来保存订单摘要详细信息。
  2. 我的proc以良好,合乎逻辑的方式在软件包中分组在一起
  • 就我个人而言,我希望MS实现某种程序包功能,因为我认为它可以使数据库更干净。

  • 1
    投票
    3)反对oracle软件包的最佳论据是,基于对Ask Ask网站的经验和研究,如果不脱机就无法更新软件包。这是无法接受的。使用SQL Server,我们可以即时更新存储过程,而不会中断生产操作。

    我理解此声明很令人沮丧,但是我不会将id称为“不可接受的”。在真实的生产环境中,绝不应在生产中测试更改。更新应该按计划和有序地从测试环境移至生产环境。在24/7系统中,冗余生产环境应在服务器更新时处理停机时间。不仅必须将程序包脱机,而且新的程序包(如果未编译)在重新联机后也会失败。 Oracle数据库需要DBA元素。但是,我确实错过了Oracle软件包。


    1
    投票
    未提及的包装的另一个特点是能够“包裹”身体。标头始终是公共的,并且有权执行该包的任何人都可以查看该标头。但这也使他们可以查看正文中的代码。您可以包装正文,对其进行加密,并防止任何人看到代码的实际作用。这是一个很好的功能,其中安全性是一个大问题。

    1
    投票
    1)就像人们所说的那样,模式是组织数据库表和过程的一种更符合逻辑且符合ANSI的方式。

    2)软件工程的最佳实践是,我们绝不应直接在任何服务器上进行更改。由于所有数据库存储过程均已编写脚本并受配置控制,因此我们可以将这些脚本排列到所需的任何文件夹结构中。

    3)反对oracle软件包的最佳论据是,基于对Ask Ask网站的经验和研究,如果不脱机就无法更新软件包。这是无法接受的。使用SQL Server,我们可以即时更新存储过程,而不会中断生产操作。

    更新:WeMartin,您说的是:“在真实的生产环境中,切勿在生产中对更改进行测试。应将更新以计划和有序的方式从测试环境移至生产。在24/7系统中,然后进行冗余生产环境应该在服务器更新时处理停机时间。“

    我一点也不意味着任何更改都已在生产中经过测试。即使已在9个较低的开发环境中测试了变更,现在仍需要将这些经过完全和彻底测试的变更部署到生产服务器。那时,使用Oracle软件包,在所有情况下都必须关闭生产服务器,即使对于较小的存储过程更改也是如此。


    0
    投票
    我要感谢幸运星,SQL Server没有软件包。 Oracle软件包很烂。

    嗯,我们需要一种方法来执行所有这些步骤并将它们放在一个位置。我知道!让我们让开发人员为每个程序包创建和维护两个文件。他们将永远爱我们!

    只要MS从未像Oracle那样实现软件包,那在我的书中将是一个胜利。

    编辑评论者:

    Oracle软件包只是将存储过程组织为软件包的一种方法,这样就不会有100个存储过程,而可能只有5个软件包。它们不能像Java或C#代码中的包一样可堆叠。所有软件包都处于同一级别。

    一个包需要两个文件:标头文件和主体文件。当向现有程序包中添加新过程时,这会造成挫败感,因为您不能在不添加标题的情况下添加主体,即使它包含的内容与主体中的信息完全相同。]

    例如,这是我一个软件包的头文件中的摘录:

    PROCEDURE bulk_approve_events ( i_last_updated_by IN VARCHAR2, o_event OUT NUMBER );

    这是体内相应的过程:

    PROCEDURE bulk_approve_events ( i_last_updated_by IN VARCHAR2, o_event OUT NUMBER ) IS ... BEGIN ... END;

    没有区别。头文件没有用,只是开发人员在使用软件包进行开发时要跨过的另一个障碍。在我的项目中,我们有一个约定,每个过程的所有注释文档都应包含在标题中,以及添加该对象的时间和添加者的详细信息,但这可以很容易地包含在正文中。

    0
    投票
    看到一个人如何克服这样一个枯燥的话题真是有趣。Oracle具有SQL Server的功能这一事实似乎并未对该功能的可争议特征产生各种反应。
    © www.soinside.com 2019 - 2024. All rights reserved.