![](/img/trans.png)
[英]Why am I getting different results via LINQ to Entities that via run of SQL generated by the same query?
[英]Why am i getting two different results from same query when executing it in a function vs anonymous block
我有相同的逻辑来检查数据库中是否存在给定的表。 一方面,我将逻辑放在一个函数中,另一方面,我将逻辑放在一个匿名块中。 当我调用该函数时,我得到一个答案,而当我运行匿名博克时,我得到另一个答案。 这是我的功能:
CREATE OR REPLACE FUNCTION table_exists(in_table_name IN varchar2) RETURN int
is
var_regex varchar2(30) := '(\w*)([^\.])';
var_exists number(1);
BEGIN
SELECT CASE WHEN EXISTS( SELECT 1 FROM all_tab_cols WHERE TABLE_NAME = UPPER( REGEXP_SUBSTR ( in_table_name, var_regex , 1, 2)))
THEN 1 ELSE 0 END INTO var_exists FROM dual;
DBMS_OUTPUT.PUT_LINE('var_exists is: ' || var_exists);
IF (var_exists = 1)
THEN
RETURN var_exists;
ELSE
RETURN var_exists;
END IF;
END;
这就是我调用此函数的方式:
select table_exists('test_schama.test_table') as table_exits from DUAL;
该函数返回零,这意味着该表不存在。 这是不正确的,因为'test_schama.test_table'确实存在。
我的匿名阻止如下:
DECLARE
in_table_name varchar2(100) := 'test_schama.test_table';
var_regex varchar2(30) := '(\w*)([^\.])';
var_exists int;
BEGIN
SELECT CASE WHEN EXISTS( SELECT 1 FROM all_tab_cols WHERE TABLE_NAME = UPPER( REGEXP_SUBSTR ( in_table_name, var_regex , 1, 2)))
THEN 1 ELSE 0 END INTO var_exists FROM dual;
DBMS_OUTPUT.PUT_LINE('var_exists is: ' || var_exists);
END;
Var_exists的值为1,表示该表存在。 没错 我不明白的是为什么我从同一个精确查询中得到两个不同的答案?
您正在查询all_tab_cols
。 这将显示您有权访问的所有表。 不一定是数据库中的所有表。 在定义者的权限存储函数(例如table_exists
)内部,将您限制为已直接(而不是通过角色)授予该函数的所有者访问权限的表。 在匿名块中, all_tab_cols
将显示通过当前会话中启用的角色可以访问的任何表的数据。 由于匿名块有效且存储的功能无效,因此我假设该函数的所有者没有直接在表上授予访问权限,但是您当前的会话确实具有启用该访问权限的角色。
您最有可能需要
all_tab_cols
行将基于当前会话的特权), dba_tab_cols
数据字典表,或者 select
不通过角色访问表的权限。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.