Postgres 8.4及更高版本的数据库包含public
模式中的模式和公司特定表中的公用表company
.
company
模式名称始终'company'
以公司编号开头并以公司编号结束.
所以可能有以下模式:
public
company1
company2
company3
...
companynn
Run Code Online (Sandbox Code Playgroud)
应用程序始终适用于单个公司.
的search_path
相应指定在ODBC或连接Npgsql的字符串,如:
search_path='company3,public'
Run Code Online (Sandbox Code Playgroud)
如何检查给定表是否存在于指定的companyn
模式中?
例如:
select isSpecific('company3','tablenotincompany3schema')
Run Code Online (Sandbox Code Playgroud)
应该返回false
,并
select isSpecific('company3','tableincompany3schema')
Run Code Online (Sandbox Code Playgroud)
应该回来true
.
在任何情况下,该函数应仅检查companyn
传递的模式,而不检查其他模式.
如果两者public
和传递的模式中都存在给定的表,则该函数应该返回true
.
它适用于Postgres 8.4或更高版本.
我想在Postgres函数中传递一个表名作为参数.我试过这段代码:
CREATE OR REPLACE FUNCTION some_f(param character varying) RETURNS integer
AS $$
BEGIN
IF EXISTS (select * from quote_ident($1) where quote_ident($1).id=1) THEN
return 1;
END IF;
return 0;
END;
$$ LANGUAGE plpgsql;
select some_f('table_name');
Run Code Online (Sandbox Code Playgroud)
我得到了这个:
ERROR: syntax error at or near "."
LINE 4: ...elect * from quote_ident($1) where quote_ident($1).id=1)...
^
********** Error **********
ERROR: syntax error at or near "."
Run Code Online (Sandbox Code Playgroud)
以下是更改为此时出现的错误select * from quote_ident($1) tab where tab.id=1
:
ERROR: column tab.id does not exist
LINE 1: ...T EXISTS …
Run Code Online (Sandbox Code Playgroud) 是否可以定义默认情况下创建新表的模式?(由"不合格的表名称"引用.)
我已经看到了在Postgres中使用"搜索路径"的一些细节,但我认为它只在检索数据时有效,而不是创建.
我有一堆SQL脚本,它们创建了许多表.我没有修改脚本,而是希望默认情况下在特定模式中设置数据库创建表 - 当它们具有非限定名称时.
这可能吗?
postgresql ×3
search-path ×2
database ×1
dynamic-sql ×1
function ×1
identifier ×1
plpgsql ×1
schema ×1
sql ×1