【发布时间】:2015-02-21 18:56:42
【问题描述】:
我似乎遇到了一个奇怪的问题,即 Oracle 没有为查询存储/返回完整的 SQL 文本。当我注意到所有CREATE TABLE ____ AS 查询的sql_text 值都被截断为20 个字符时,我正在通过将v$session 连接到v$sqltext 来监控当前活动的查询。
例如:
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.
我认为这可能是一个孤立的事件,所以我检查了 所有 CREATE TABLE v$sqltext 中的条目:
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 = 1 和 query_len = 20。
但是,如果我在查询完成后检查dba_audit_trail(假设我事先知道正在创建什么表),那么完整的 sql_text 就会出现在那里。
发生了什么事,我该如何解决这个问题,所以v$sqltext 包含CREATE TABLE ___ AS 语句的完整查询?
编辑:经过仔细检查,似乎所有GRANT、CREATE 和ALTER 查询在v$sqltext 中都被截断为20 个字符。所有其他查询都包含其全文。我正在开放赏金,希望能查明真相。
【问题讨论】:
-
您是否尝试过执行类似
select sql_text from v$sqltext where sql_id = '...'的操作来查看,该视图究竟包含哪些sql_id 的内容?只是为了排除以前查询中的所有可能错误。如果这个视图真的只包含查询的一部分,我想这是一个错误。 -
@Dmitry - 我做到了。我检查了来自
v$sqltext的sql_text和sql_fulltext以及来自v$sqltext_with_newlines的sql_text。这似乎只是 CTAS 查询的问题,其他一切似乎都很好。 -
@Mr.Llama 我很确定这是一个孤立的问题。我跑了
select a.*,length(a.sql_text) From v$sqltext a where upper(sql_text) like '%CREATE TABLE%';,得到的长度最多为 64 个字符。与ALTER和GRANT相同。我在 11gR2 上。 -
我想知道是否有一些安全限制导致了这种情况。我不想看到
alter user me identified by "myNewPassword";之类的声明出现在V$SQL中。 -
对照 12.1.0.2 检查,长度也达到 64 个字符。