小编jpm*_*c26的帖子

通过 Oracle Instant Client 使用 LDAP 进行名称查找

部分原因是在完全安装 Oracle 客户端时遇到版本冲突或位数问题,我的开发团队(我是其中的成员)一直在转向使用Oracle Instant Client并避免在我们的开发机器上安装大多数新项目。这已经很有效了,甚至到了我们使用此设置部署到生产的程度。由于我们主要是一家 .NET 商店,因此我们使用本机客户端(带有 .NET 包装器),而不是 Java 客户端。

现在客户端要求我们向 LDAP 服务器注册数据库服务并使用 LDAP 服务器进行名称查找。他们提供sqlnet.oraldap.ora显示文件(以及伴随的加密的配置文件)是正确的。特别是,该sqlnet.ora文件确实将 LDAP 指定为查找网络服务名称的可能来源:

names.directory_path=(tnsnames,ldap)
Run Code Online (Sandbox Code Playgroud)

我相信我正在使用的机器可以使用 LDAP 访问服务,因为我能够使用 SQL Developer(它允许我直接输入 LDAP 信息)来访问该服务。假设它们是正确的,如何让 Instant Client 识别此配置并使用 LDAP 进行名称查找?

到目前为止我尝试过的

我已尝试将TNS_ADMIN环境变量设置为包含所提供文件的目录,虽然这对于使 Instant Client 识别tnsnames.ora文件很有效,但似乎不足以让它开始查看 LDAP。以下是结果(更改了路径、用户名和密码):

(以下命令恰好是 Windows 命令提示符,但我想在 Linux 上也可以执行类似的操作。这里sqlplus看到的也是 Instant 版本,在同一目录中附带了 Instant Client 二进制文件。)

C:\TEMP>SET TNS_ADMIN=C:\path\to\sqlnet\ldap\and\tnsnames\ora\files

C:\TEMP>echo %TNS_ADMIN%
C:\path\to\sqlnet\ldap\and\tnsnames\ora\files

C:\TEMP>sqlplus.exe USERNAME/PASSWORD@LOCALTNSNAME

SQL*Plus: Release 11.2.0.2.0 Production on Mon Jul 7 10:22:25 2014

Copyright (c) …
Run Code Online (Sandbox Code Playgroud)

oracle

14
推荐指数
1
解决办法
9474
查看次数

如何关联同一个表中的两行

我有一个表格,其中的行可以相互关联,从逻辑上讲,两行之间的关系是双向的(基本上是无方向的)。(如果您想知道,是的,这确实应该是一张表。它是完全相同的逻辑实体/类型的两个事物。)我可以想到几种方法来表示这一点:

  1. 存储关系及其反向
  2. 以一种方式存储关系,限制数据库以另一种方式存储它,并有两个 FK 顺序相反的索引(一个索引是 PK 索引)
  3. 用两个索引以一种方式存储关系,并允许插入第二个索引(听起来有点恶心,但嘿,完整性)
  4. 创建某种分组表,并在原始表上对其进行 FK。(提出了很多问题。分组表只会有一个数字;为什么还要有表?使 FK NULLable 或具有关联单行的组?)

这些方式有哪些主要的优缺点,当然,还有什么我没有想到的方式?

这是一个可以玩的 SQLFiddle:http ://sqlfiddle.com/#!12/7ee1a/1/0 。(碰巧是 PostgreSQL,因为那是我正在使用的,但我认为这个问题不是 PostgreSQL 特有的。)它目前存储关系及其反向仅作为示例。

foreign-key database-design

12
推荐指数
1
解决办法
1万
查看次数

我应该在进行批量更新时禁用表上的自动清理吗?

我需要对表中的所有行执行简单的更新。该表有 40-50 百万行。在此期间删除索引和约束会UPDATE导致巨大的性能改进。

但是自动吸尘器呢?autovacuum 可以启动 aVACUUM还是ANALYZE在 a 的中间UPDATE?如果是这样,那会消耗机器资源的无用工作。我可以先在桌子上禁用它UPDATE,然后再重新启用它:

ALTER TABLE my_table
SET (autovacuum_enabled = false, toast.autovacuum_enabled = false);
-- Drop constraints, drop indexes, and disable unnecessary triggers

UPDATE my_table SET ....;

-- Restore constraints, indexes, and triggers
ALTER TABLE my_table
SET (autovacuum_enabled = true, toast.autovacuum_enabled = true);
Run Code Online (Sandbox Code Playgroud)

如果我在第一个之后不提交,这甚至有效ALTER吗?

另外,如果我在禁用它UPDATE,将它触发的更新,还是会因为它是他们中禁用它忽略这些更新?(我怀疑它会运行,但我宁愿确定。)

我现在正在使用 PG 9.3,但应该很快就会升级。因此,任何提及新版本更改的内容都值得赞赏。

postgresql bulk autovacuum

9
推荐指数
1
解决办法
6031
查看次数

如何在 PL/pgSQL EXCEPTION 块中重新引发异常?

考虑函数内的以下(不完整的)PL/pgSQL 块:

CREATE OR REPLACE FUNCTION my_calc(myvar1 NUMERIC, myvar2 NUMERIC)
    RETURNS NUMERIC
    RETURNS NULL ON NULL INPUT
    IMMUTABLE
    LANGUAGE plpgsql
    AS $$
    BEGIN
        RETURN some_third_party_function(myvar1, myvar2);
    EXCEPTION WHEN internal_error THEN
        IF SQLERRM LIKE 'KnownErrorPrefix:%' THEN
            RETURN 0;
        ELSE
            -- Reraise the original exception here
            RAISE EXCEPTION '%', SQLERRM;
        END IF;
    END
    $$
Run Code Online (Sandbox Code Playgroud)

当发生意外错误时,此代码将引发具有相同消息的新异常。但是,它不会保留原始类型或上下文。

如何重新引发或重新抛出未修改的原始异常?

postgresql exception plpgsql

6
推荐指数
1
解决办法
3828
查看次数

带复位值的累计和

考虑下表:

ID | GROUP_ID | ORDER_VAL | RESET_VAL | VAL 
---+----------+-----------+-----------+-----
1  | 1        | 1         | (null)    | 3   
2  | 1        | 2         | (null)    | 2   
3  | 1        | 3         | (null)    | 1   
4  | 1        | 4         | 4         | 2   
5  | 1        | 5         | (null)    | 1   
6  | 2        | 1         | (null)    | 4   
7  | 2        | 2         | 2         | 3   
8  | 2        | 3         | …
Run Code Online (Sandbox Code Playgroud)

oracle oracle-11g-r2

5
推荐指数
1
解决办法
7887
查看次数

什么是 base64 RAW?我如何使用它?

Oracle有用于编码的二进制值,特别是一个功能RAW类型,成BASE64: BASE64_ENCODE。这是有道理的。我想把二进制文件变成我可以更轻松地跨系统移植的东西。

但是,除了接受二进制RAW作为其输入之外,它还RAW为其输出返回一个二进制。我觉得这非常令人困惑,因为 base64 的目的是以文本格式对字节进行编码。

那么这个输出RAW实际上包含什么?将其转换为实际文本类型(例如,VARCHAR2)的正确方法是什么?

我还假设BASE64_DECODE它的输入与 的输出格式相同BASE64_ENCODE,但请注意,如果不是这种情况。

我专门使用 Oracle 11.2,但我怀疑自从它被引入以来这已经改变了。如果我错了,请随时纠正我的错误。

oracle

5
推荐指数
1
解决办法
1万
查看次数

按顺序插入和聚类效果一样吗?

我有一个表,其中包含一些基于其他表的预先计算的数据。(考虑到我必须处理的数据大小,动态计算的计算成本太高。)随着源数据的添加,我将逐步生成。(UPDATE在正常使用中我永远不需要它;部分可能会被删除和重新生成。)该表将相当大。它目前大约有 5000 万行,并且每年都会增长。

对该表的大多数查询都将通过外键 ID 列进行过滤。因此,如果该 ID 的所有行都分组到相同的页面中,它们的性能会更好。我可以通过创建索引和CLUSTER定期调用来保证磁盘上的这种排序,但这显然不太理想,因为它需要某种计划任务,根据使用情况和其他计划任务进行协调等。

但是,由于我以与我想要使用的外键相关的块的形式生成这些数据CLUSTER,因此我可以轻松地ORDER BYINSERT命令中添加一个子句:

INSERT INTO big_table (source_table1_id,a,b,c)
SELECT
   source_table1_id,
   5 /* some formula */,
   /* ... */
FROM source_table1
JOIN source_table2 ON ...
...
WHERE ... /* some condition indicating what needs to be generated */
ORDER BY source_table1_id
Run Code Online (Sandbox Code Playgroud)

这是否会影响磁盘存储顺序,将行分组为接近最小页数?如果确实如此,是否还有其他进程可能会在以后弄乱磁盘顺序?

我目前正在使用 PostgreSQL 9.3,但我想了解更新的版本以及升级。

postgresql performance

5
推荐指数
1
解决办法
787
查看次数

仅对 ORDER BY 子句中的第一列进行排序

似乎我误解了“订购”的概念。

我有一个包含这种结构和数据的表:

CREATE TABLE TestTest (Value1 Int, Value2 Int);

INSERT INTO TestTest VALUES
(1, 10),
(2, 9),
(3, 8),
(4, 7),
(5, 6),
(6, 5),
(7, 4),
(8, 3),
(9, 2),
(10, 1)
;
Run Code Online (Sandbox Code Playgroud)

使用以下查询:

Select Value1 , Value2
from TestTest
order by Value1 desc,Value2 desc
Run Code Online (Sandbox Code Playgroud)

我期望两列Value1Value2从 10 到 1,因为我DESC用于两列。

但我看到这个输出:

Value1 按降序排列,Value2 不

为什么不是Value2降序排列?

sql-server order-by t-sql

4
推荐指数
3
解决办法
3524
查看次数

将 search_path 重置为全局、集群默认值

search_path假设我像这样永久更改我的数据库:

ALTER DATABASE my_db SET search_path TO "$user",public,other_schema;
Run Code Online (Sandbox Code Playgroud)

如何将其重置回该集群上原始的、未更改的数据库所具有的默认值?

这通常是这样"$user",public,但可以通过配置文件进行更改。有一种方法可以读取来自配置文件的参数值(因此我可以在最坏的情况下构建动态查询),但我没有找到任何类似的东西。

postgresql configuration

3
推荐指数
1
解决办法
6133
查看次数

使用 Oracle 的 Easy Connect 语法有什么缺点吗?

Oracle 允许使用几种不同的语法来指定在哪里可以找到您的数据库服务。我最常看到的(在我专业开发软件的短短几年里)看起来像这样:

(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=myserver)(PORT=1521))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=myservice)))
Run Code Online (Sandbox Code Playgroud)

我不认为这种语法有任何特定的名称,但如果您使用图形工具对其进行修改,它就是 Oracle 在其 TNS 文件中生成的。但是 Oracle 还允许使用以下更紧凑的语法,至少对于 SQL*Plus 和 application divers 之类的工具是这样:

myserver:1521/myservice
Run Code Online (Sandbox Code Playgroud)

这称为Easy Connect,我读到它是由 Oracle 10g 引入的。这使它大约有 10 年的历史。我不确定这是否可以在 TNS 文件中使用,尽管如此简短,但我认为没有必要将其放入 TNS 文件中。在我看来,它的好处是:您可以直接在您的应用程序中使用它,而无需维护 TNS 文件。

但是,从我所做的工作和与我合作过的客户来看,它的使用似乎并不常见。我什至知道它的唯一原因是因为 ESRI 开始推荐使用它在较新版本的 ArcGIS 中建立连接。这让我想知道为什么它不常见,那么使用 Easy Connect 有什么缺点吗?

(如果有人可以添加更多标签,我将不胜感激。我想不出/找到更多有意义的标签。)

oracle

0
推荐指数
1
解决办法
532
查看次数

如何找到数字范围之间的差距?

考虑下表:

T_ID | T_START | T_END
-----+---------+------
   1 | 0.25    | 0.5
   2 | 0.8     | 1
   3 | 0.4     | 0.6
   4 | 0.2     | 0.3
   5 | 0.7     | 0.8
Run Code Online (Sandbox Code Playgroud)

T_ID是独特的。每行代表一个连续范围的数字,是 0 到 1 的子集。T_START小于T_END

我需要确定未包含在 0 和 1 之间的任何范围。请注意,某些范围确实重叠。端点的排他性与我的用例无关;我只需要确定差距的端点是什么。(因此,不考虑单点差距。)

对于这个特定的数据集,我希望结果是

GAP_START | GAP_END
----------+--------
0         | 0.2
0.6       | 0.7
Run Code Online (Sandbox Code Playgroud)

实际数据集很大,并且将聚合到其他一些数据上(数十万行,每个聚合组可能有 100 行),因此性能很重要。(不过,性能不佳但可能会改进的答案是受欢迎的。)

我曾考虑尝试首先确定覆盖范围是什么,然后尝试反转它,但我什至无法弄清楚如何计算覆盖范围。简单GROUP BY是不够的,因为我们有重叠范围链,它们会合并为一个范围,即使并非所有范围都相互重叠。我认为递归查询可能会有所帮助,但我还没有弄清楚它的逻辑。

我用这个示例数据集创建了一个 SQLFiddle 。

可悲的是(而且毫无成效),我不能随意修改底层表示。

oracle oracle-11g-r2

0
推荐指数
1
解决办法
4263
查看次数