由于SQL Server没有软件包,程序员可以做些什么来绕过它呢?

时间:2009-04-20 22:04:55

标签: sql-server oracle packages

我有一个SQL Server数据库,存储过程大量增加。由于Oracle“包”功能,我的Oracle数据库中存在大量存储过程。

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

9 个答案:

答案 0 :(得分:23)

虽然SQL Server通过封装和封装状态的“酷炫功能”无法提供,但您已经习惯了,但您可以将存储过程组织为模式。

在企业管理器中,如果你有数百个触发器,这些触发器仍然全部列在一起,这将成为一个巨大的树形图。我也很想念Oracle软件包的组织和很酷的功能。但是,所有平台都有自己的优势。

注意:在.NET语言中编写存储过程可以为您提供封装和状态。但是它仍然没有以任何特殊的方式在EM树视图中将它们分开。

答案 1 :(得分:14)

提出一个好的命名约定,使用它并强制执行它。

答案 2 :(得分:8)

模式可用于组织存储过程和其他对象。就个人而言,我更喜欢在按功能区域组织对象时使用模式,并且这些功能区域对应于安全边界。 AdventureWorks示例数据库中提供了一个示例,其中包含“HumanResources”和“Sales”等模式。理论是给定用户可能需要访问“HumanResources”中的对象,但可能不需要访问“Sales”信息。

另一种选择是使用命名约定并强制执行它,正如James上面所说的那样。我将补充说,SQL Server Management Studio有一个过滤器按钮,可用于过滤显示的对象列表。例如,可以单击“存储过程”文件夹,过滤名称包含“添加”。

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

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

答案 3 :(得分:5)

我曾经使用过SQL Server和Oracle,所以看到了两者的好坏。由于上述评论有点激烈,我会尽量保持中立......

那么,什么是Oracle软件包?可以把它想象成一个数据库类

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

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

我发现包非常有用,原因有很多:

  1. 您已经拥有了可以提供给其他开发人员的公共界面的概念
  2. 包可以镜像您编译的类。我的Orders.Save()C#方法将调用我的Oracle Orders.SaveLineItem方法来保存每个订单项,并使用Oracle SaveOrder方法来保存订单摘要详细信息。
  3. 我的触发器在包
  4. 中以一种不错的逻辑方式组合在一起

    就个人而言,我会喜欢MS来实现某种软件包功能,因为我认为它可以创建一个更干净的数据库。

答案 4 :(得分:1)

1)就像人们所说的那样,Schema是一种更符合逻辑且符合ANSI标准的组织数据库表和程序的方法。

2)软件工程最佳实践是我们不应该直接在任何服务器上进行更改。由于所有数据库sprocs都是脚本化的并且在配置控制下,我们可以将这些脚本安排到我们想要的任何文件夹结构中。

3)针对oracle软件包的最佳理由是,基于Ask Tom网站的经验和研究,无法在不脱机的情况下更新软件包。这是无法接受的。使用SQL Server,我们可以动态更新存储过程,而不会中断生产操作。

更新:WeMartin,你说“在真正的生产环境中,永远不应该在生产中测试更改。更新应该以有序和有序的方式从测试环境转移到生产。在24/7系统中,然后冗余生产环境应该在服务器更新时处理停机时间“。

我并不是说在生产中测试任何变化。即使在9个较低的开发环境中测试了更改,现在需要将这些完全彻底测试的更改部署到生产服务器。此时,使用Oracle软件包时,必须在所有情况下关闭生产服务器,即使对于较小的sproc更改也是如此。

答案 5 :(得分:1)

3)针对oracle软件包的最佳理由是,基于Ask Tom网站的经验和研究,无法在不脱机的情况下更新软件包。这是无法接受的。使用SQL Server,我们可以动态更新存储过程,而不会中断生产操作。

我理解这句话的挫败感,但我不会称id为“不可接受”。在真正的生产环境中,永远不应在生产中测试变更。应以预定和有序的方式将更新从测试环境移至生产环境。在24/7系统中,冗余生产环境应该在服务器更新时处理停机时间。该软件包不仅必须脱机,而且如果没有编译,新软件包将在重新联机时失败。 Oracle数据库需要DBA元素。但是,我确实错过了Oracle软件包。

答案 6 :(得分:1)

未提及的包装的另一个特点是能够“包裹”身体。标头始终是公共的,任何有权执行包的人都可以查看。但这也允许他们查看正文中的代码。您可以包装正文,加密它,并防止任何人看到代码实际正在做什么。它是一个很好的功能,安全性是一个大问题。

答案 7 :(得分:1)

看到一个人如何能克服这样一个枯燥的话题有点有趣。 Oracle具有SQL Server的功能这一事实似乎并未对该功能的可争议特性产生各种反应。

对于初学者来说,问题的风格是:SQL Server中缺少Oracle中的此功能,推荐的方法是什么。

无需对此感到情绪激动。

对于那些不喜欢Oracle打包功能的用户,无论出于何种原因,他们仍然可以像使用SQL Server一样进行操作。

深入了解细节,可能会有一个风格上的后续问题:在修改包中的函数或过程时,整个包都将失效并且这种“吸吮”是推荐的避免方式吸吮方面。

就个人而言,我从未见过有人抱怨无法在可执行文件中修改静态链接库而不必重新链接它。

答案 8 :(得分: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;

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