我有一个SQL Server数据库,该数据库具有大量存储过程。由于Oracle的“打包”功能,大量的存储过程在我的Oracle数据库中不是问题。
程序员如何解决缺少像Oracle那样的“软件包”功能的问题?
虽然SQL Server通过封装和包状态的[酷功能]无法提供任何功能[[就像您惯用的,但是您可以将存储的过程组织到架构中。
在企业管理器中,这些过程仍被一起列出,如果您有数百个过程,则这些树会形成巨大的树形列表。我也想念Oracle软件包的组织和出色功能。但是,所有平台都有其优势。[注意:用.NET语言编写存储过程确实会给您封装和状态。但是,它仍然没有以任何特殊方式在EM树视图中将它们分开。
一种替代方法是使用命名约定并强制执行,如James所说。我要补充一点,SQL Server Management Studio具有一个过滤器按钮,可用于过滤显示的对象列表。例如,可以单击“存储过程”文件夹,并且名称上的过滤器包含“添加”。
在我当前的项目中,我已经从SSIS包中提取了许多SQL查询,并放入了存储过程中。为了区分这些存储过程和应该通用的存储过程,我在名称前加了“ ssis”。如果我可以在C#或C ++中创建类似于命名空间的内容,并创建“ SSIS.SelectUserLookupData”而不是“ ssis_SelectUserLookupData”,那肯定会更加令人愉快。如果这些命名空间可以嵌套,那就更好了。
如果这是Oracle中Packages的特色之一,那么也许有人会让我知道。
那么,什么是Oracle软件包?像数据库类一样思考]
该包具有两个元素:头文件和主体文件。头文件是您的公共接口,包含可直接调用的所有存储过程或函数的签名(名称,参数和返回类型(如果适用))(在Oracle中,一个函数返回一个值,一个存储proc不返回)。程序包主体必须在程序包头文件中实现所有过程签名。
包的body元素包含实际完成工作的所有存储的proc和逻辑。您可能在包头中声明了一个Save过程,该过程调用主体中存在的插入或更新proc。开发人员只能看到“保存”过程。重要的是要记住,程序包主体还可以实现未在程序包头中声明的proc或函数,它们仅在程序包本身之外不可访问。
由于多种原因,我发现软件包确实非常有用:
我理解此声明很令人沮丧,但是我不会将id称为“不可接受的”。在真实的生产环境中,绝不应在生产中测试更改。更新应该按计划和有序地从测试环境移至生产环境。在24/7系统中,冗余生产环境应在服务器更新时处理停机时间。不仅必须将程序包脱机,而且新的程序包(如果未编译)在重新联机后也会失败。 Oracle数据库需要DBA元素。但是,我确实错过了Oracle软件包。
2)软件工程的最佳实践是,我们绝不应直接在任何服务器上进行更改。由于所有数据库存储过程均已编写脚本并受配置控制,因此我们可以将这些脚本排列到所需的任何文件夹结构中。
3)反对oracle软件包的最佳论据是,基于对Ask Ask网站的经验和研究,如果不脱机就无法更新软件包。这是无法接受的。使用SQL Server,我们可以即时更新存储过程,而不会中断生产操作。
更新:WeMartin,您说的是:“在真实的生产环境中,切勿在生产中对更改进行测试。应将更新以计划和有序的方式从测试环境移至生产。在24/7系统中,然后进行冗余生产环境应该在服务器更新时处理停机时间。“
我一点也不意味着任何更改都已在生产中经过测试。即使已在9个较低的开发环境中测试了变更,现在仍需要将这些经过完全和彻底测试的变更部署到生产服务器。那时,使用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;
没有区别。头文件没有用,只是开发人员在使用软件包进行开发时要跨过的另一个障碍。在我的项目中,我们有一个约定,每个过程的所有注释文档都应包含在标题中,以及添加该对象的时间和添加者的详细信息,但这可以很容易地包含在正文中。