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

17 sql-server oracle packages

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

程序员做了什么来解决缺乏像Oracle那样的"包"功能?

The*_*edi 24

虽然SQL Server没有像您习惯的那样通过封装和封装状态的"酷炫功能"提供任何功能,但您可以将存储过程组织为模式.

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

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


Jam*_*mes 14

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


Joh*_*ers 8

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

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

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

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

  • 我喜欢你如何回答你所关闭的"不是问题"的问题.真正优雅. (6认同)
  • @Jedi:我不知道怎么和你一起赢.一旦社区通过重新开放决定这是一个问题,我就把它作为一个问题进行了处理,并贡献了一些我认为以前不存在的东西.如果有人真的发现这个问题寻求帮助,我想我的回答可能会有所帮助.它来自我的经验,而不是我们讨论的"重写",我决定反对. (4认同)
  • @Jedi:我需要别人来帮助我忽略原问题中的势利态度,并听取应该问的问题. (4认同)

小智 5

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

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

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

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

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

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

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