INFORMATION_SCHEMA.ROUTINES中SPECIFIC_SCHEMA和ROUTINE_SCHEMA有什么区别?

时间:2014-05-16 13:29:47

标签: sql sql-server

INFORMATION_SCHEMA.ROUTINES包含以下两列:

SPECIFIC_SCHEMA: Specific name of the schema.
ROUTINE_SCHEMA: Name of the schema that contains this function.

technet doc

SPECIFIC_ROUTINE_版本的CATALOGNAME被定义为等效的(目录的特定名称。此名称与{{ 1}} .-),但SCHEMA-

省略了这个措辞

ROUTINE_CATALOGSPECIFIC_SCHEMA之间的区别是什么?

[编辑:显然3年多以后,这被标记为重复,所以我必须澄清。建议的副本是关于不同的字段,所以不,我不相信它是重复的。]

2 个答案:

答案 0 :(得分:3)

这有点像向后兼容性。

INFORMATION_SCHEMA本身仅用于更轻松地迁移服务器版本和简化。我将提供基于SQL Server的示例。

您可能希望(或可能需要)使用表sys.objects,该表基本上提供INFORMATION_SCHEMA.ROUTINES提供的几乎所有相同信息。事实上,如果你真的想知道一个程序的真实模式名称,你需要使用它 - 正如微软已经在他们自己的docs中说明的那样。但是如果你需要构建一个只需要一些基本信息的产品,比如一个例程是否存在或类似的东西,你就不会去sys.objects它可能会从服务器版本变为服务器版本。这使得维护更加困难。 INFORMATION_SCHEMA在许多版本中基本保持不变。只会进行少量更改,并且视图下方的工作将由Microsoft更改。这意味着您可以使用多年的稳定代码和许多不同的服务器版本。

这可能是因为有两列具有相同的定义,因此内容相同。它与SPECIFIC_NAMEROUTINE_NAMESPECIFIC_CATALOGROUTINE_CATALOG相同。它们基本上是相同的,正如微软在他们的文档中所说的那样。

它可能是一个遗留物,可能永远存在,只是为了兼容其他DBMS代码或旧版本的SQL Server本身。

顺便说一句,Postgres有两行,它们都包含相同的内容。

答案 1 :(得分:0)

这是为了重载。这个问题与this question here重复。

基本上,您可以在SQL规范中仅在一个模式中重载函数。

重载和查找。

让我们以ST_Union为例,您可以看到签名herehere

SELECT specific_catalog, specific_schema, specific_name, routine_catalog, routine_schema, routine_name
FROM information_schema.routines
WHERE routine_name = 'st_union';
 specific_catalog | specific_schema |  specific_name  | routine_catalog | routine_schema | routine_name 
------------------+-----------------+-----------------+-----------------+----------------+--------------
 test             | public          | st_union_259584 | test            | public         | st_union
 test             | public          | st_union_259621 | test            | public         | st_union
 test             | public          | st_union_259622 | test            | public         | st_union
 test             | public          | st_union_260448 | test            | public         | st_union
 test             | public          | st_union_260450 | test            | public         | st_union
 test             | public          | st_union_260452 | test            | public         | st_union
 test             | public          | st_union_260454 | test            | public         | st_union
 test             | public          | st_union_260456 | test            | public         | st_union
(8 rows)

您可以在此处看到st_union超载8次。您无法看到的原因是:其中一些是聚合,其中一些是rasters,另一些是geometry。重点是,你打电话给st_union取决于你所说的内容,你可能会st_union_260454st_union_259621或其他任何人。

Catch是,SQL允许您根据您调用它的模式获得不同的。

SELECT current_schema;

返回public。那是我search_path中的第一个架构。我可以创建一个提供第9个ST_Union的子,但只能在模式foobar内工作。这样做会提供routine_name st_union的第9次重载。这会使上面的回报像这样......

SELECT specific_catalog, specific_schema, specific_name, routine_catalog, routine_schema, routine_name
FROM information_schema.routines
WHERE routine_name = 'st_union';
 specific_catalog | specific_schema |  specific_name  | routine_catalog | routine_schema | routine_name 
------------------+-----------------+-----------------+-----------------+----------------+--------------
 test             | public          | st_union_259584 | test            | public         | st_union
 test             | public          | st_union_259621 | test            | public         | st_union
 test             | public          | st_union_259622 | test            | public         | st_union
 test             | public          | st_union_260448 | test            | public         | st_union
 test             | public          | st_union_260450 | test            | public         | st_union
 test             | public          | st_union_260452 | test            | public         | st_union
 test             | public          | st_union_260454 | test            | public         | st_union
 test             | public          | st_union_270456 | test            | foobar         | st_union
(9 rows)
  • 如果我的search_path只是foobar,则签名更符合st_union_270456
  • 的类型
  • 如果我的search_pathfoobar,public,则foobar覆盖public中的例程或提供例程public未提供。{/ li>

CURRENT_SCHEMA只是PostgreSQL search_path中的第一个模式。 PostgreSQL通过允许您在多个模式中解决问题来扩展规范。