Oracle - CREATE/ALTER/GRANT语句的sql_text截断为20个字符?

3

我似乎遇到了一个奇怪的问题,Oracle不会存储/返回查询的完整SQL文本。当我将v$session连接到v$sqltext来监视当前活动查询时,我注意到所有的CREATE TABLE ____ AS查询都有一个被截断为20个字符的sql_text值。

例如:

SQL> SELECT sql_text, LENGTH(sql_text), sql_fulltext, LENGTH(sql_fulltext) FROM v$sql WHERE sql_id = 'sql_id_here';

SQL_TEXT                            LENGTH(SQL_TEXT) SQL_FULLTEXT                        LENGTH(SQL_FULLTEXT)
----------------------------------- ---------------- ----------------------------------- --------------------
create table schema.                              20 create table schema.                                  20

1 row selected.


SQL> SELECT sql_text, LENGTH(sql_text) FROM v$sqltext WHERE sql_id = 'sql_id_here';

SQL_TEXT                            LENGTH(SQL_TEXT)
----------------------------------- ----------------
create table schema.                              20

1 row selected.

SQL> SELECT sql_text, LENGTH(sql_text) FROM v$sqltext_with_newlines WHERE sql_id = 'sql_id_here';

SQL_TEXT                            LENGTH(SQL_TEXT)
----------------------------------- ----------------
create table schema.                              20

1 row selected.

我认为这可能是一次孤立事件,所以我检查了v$sqltextCREATE TABLE的所有条目:

SELECT sql_id, COUNT(*) AS entries, SUM(LENGTH(sql_text)) AS query_len
FROM v$sqltext
WHERE sql_id IN (
    SELECT sql_id
    FROM v$sqltext
    WHERE piece = 0
      AND UPPER(sql_text) LIKE 'CREATE TABLE%'
)
GROUP BY sql_id
ORDER BY 1, 2, 3

在250多个sql_id条目中,所有的entries = 1query_len = 20
然而,在查询完成后(假设我事先知道正在创建哪个表),如果我检查dba_audit_trail ,完整的sql_text就会出现在那里。
发生了什么以及如何修复这个问题,使得v$sqltext包含CREATE TABLE ___ AS语句的完整查询?
编辑:经过仔细检查,所有的GRANTCREATEALTER查询在v$sqltext中都被截断为20个字符。所有其他查询都包含它们的完整文本。我正在开放一个悬赏来解决这个问题。

你尝试过执行类似 select sql_text from v$sqltext where sql_id = '...' 这样的语句来查看某个 sql_id 对应的视图中到底包含了什么内容吗?这样可以排除之前查询中所有可能出现的错误。如果这个视图确实只包含了查询的一部分,那么我认为这是一个 bug。 - Dmitriy
@Dmitry - 我已经检查了v$sqltext中的sql_textsql_fulltext,以及v$sqltext_with_newlines中的sql_text。这似乎只是在CTAS查询中存在问题,其他所有内容都显示正常。 - Mr. Llama
@Mr.Llama 我非常确定这是一个孤立的问题。我运行了 select a.*,length(a.sql_text) From v$sqltext a where upper(sql_text) like '%CREATE TABLE%'; 并得到了最多64个字符的长度。ALTERGRANT 也是一样。我使用的是11gR2版本。 - Anjan Biswas
我想知道是否有一些安全限制导致了这个问题。我不希望看到像 alter user me identified by "myNewPassword"; 这样的语句出现在 V$SQL 中。 - Jon Heller
已经检查过了12.1.0.2版本,长度最长达到64个字符。 - peter.hrasko.sk
我开始认为这可能是设置或审计配置错误,但是我最后检查时从未看到过“截断sql文本到N个字符但在审计跟踪中保留完整文本”的设置。任何设置建议都将非常棒。 - Mr. Llama
1个回答

4
这似乎是11.2.0.4版本已知问题。如果您可以访问My Oracle Support,请查看bug 19634213、bugs 18431964、20308798,以及可能的18245071(未公开)。我无法详细说明或重现他们所说的内容。从nop77svk的评论中可以看出,这个问题可能已在12c中得到解决,但也可能是特定于平台的。
如果这个问题导致了问题,您需要向Oracle提出服务请求,以验证您是否遇到了相同的问题,并找出是否有可用的补丁程序。

你说得一点也没错。Bug 19634213正是我们正在处理的问题。目前看来,除了升级到Oracle 12(这对我们来说不是一个选择),似乎没有其他解决方法。希望他们能在不久的将来推出修复方案。 - Mr. Llama

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接