相关疑难解决方法(0)

截断Postgres数据库中的所有表

我经常需要在重建之前删除PostgreSQL数据库中的所有数据.我将如何直接在SQL中执行此操作?

目前我已经设法提出一个SQL语句,它返回我需要执行的所有命令:

SELECT 'TRUNCATE TABLE ' ||  tablename || ';' FROM pg_tables WHERE tableowner='MYUSER';
Run Code Online (Sandbox Code Playgroud)

但是,一旦拥有它们,我就无法以编程方式执行它们.

postgresql truncate dynamic-sql plpgsql database-table

142
推荐指数
8
解决办法
13万
查看次数

search_path如何影响标识符解析和"当前架构"

是否可以定义默认情况下创建新表的模式?(由"不合格的表名称"引用.)

我已经看到了在Postgres中使用"搜索路径"的一些细节,但我认为它只在检索数据时有效,而不是创建.

我有一堆SQL脚本,它们创建了许多表.我没有修改脚本,而是希望默认情况下在特定模式中设置数据库创建表 - 当它们具有非限定名称时.

这可能吗?

postgresql schema search-path database-table

46
推荐指数
2
解决办法
3万
查看次数

PostgreSQL参数化表函数中的Order By/Limit

我有一个sql函数,它执行一个简单的sql select语句:

CREATE OR REPLACE FUNCTION getStuff(param character varying)
  RETURNS SETOF stuff AS
$BODY$
    select *
    from stuff
    where col = $1
$BODY$
  LANGUAGE sql;
Run Code Online (Sandbox Code Playgroud)

现在我调用这个函数是这样的:

select * from getStuff('hello');
Run Code Online (Sandbox Code Playgroud)

如果我需要订购并限制结果order bylimit条款,我有哪些选择?

我想这样的查询:

select * from getStuff('hello') order by col2 limit 100;
Run Code Online (Sandbox Code Playgroud)

效率不高,因为表中的所有行都stuff将由函数返回,getStuff然后按限制排序和切片.

但即使我是对的,如何通过sql语言函数的参数传递顺序也没有简单的方法.只能传递值,而不能传递sql语句的一部分.

另一种选择是用plpgsql语言创建函数,在那里可以构造查询并通过它来执行EXECUTE.但这也不是一个非常好的方法.

那么,有没有其他方法可以实现这一目标?或者你会选择什么选择?在函数外部订购/限制,还是plpgsql?

我正在使用postgresql 9.1.

编辑

我修改了CREATE FUNCTION语句,如下所示:

CREATE OR REPLACE FUNCTION getStuff(param character varying, orderby character varying)
  RETURNS SETOF stuff AS
$BODY$
    select t.* …
Run Code Online (Sandbox Code Playgroud)

sql database postgresql dynamic-sql plpgsql

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

如何删除Postgres中表的所有索引?

我一直有这个问题:我有一个表上需要删除的20个索引才能进行测试.删除表不会丢弃所有这些元数据.

似乎没有通配符drop index ix_table_*或任何有用的命令.你可以编写的psql周围似乎有一些bash循环.
必须有更好的东西!思考?

postgresql indexing ddl metadata dynamic-sql

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

PostgreSQL函数与OUT参数和TABLE结果之间是否存在任何形式上的差异?

考虑这两个PostgreSQL函数:

CREATE OR REPLACE FUNCTION f_1 (v1 INTEGER, v2 OUT INTEGER)
AS $$
BEGIN
    v2 := v1;
END
$$ LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION f_2 (v1 INTEGER)
RETURNS TABLE(v2 INTEGER)
AS $$
BEGIN
    v2 := v1;
END
$$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)

在任何"普通"的过程SQL语言(例如Transact-SQL)中,两种类型的函数将完全不同.f_1实际上是一个程序,而是f_2一个表值函数.在SQL Server中,后者是这样返回的INFORMATION_SCHEMA.ROUTINES:

SELECT r.routine_schema, r.routine_name
FROM   information_schema.routines r
WHERE  r.routine_type = 'FUNCTION'
AND    r.data_type = 'TABLE'
Run Code Online (Sandbox Code Playgroud)

但是在PostgreSQL中,这不起作用.以下查询显示f_1和的签名之间基本没有区别f_2:

SELECT r.routine_name, r.data_type, p.parameter_name, p.data_type
FROM   information_schema.routines r
JOIN   information_schema.parameters p
USING …
Run Code Online (Sandbox Code Playgroud)

sql postgresql stored-procedures user-defined-functions out-parameters

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

删除命名空间中的所有函数?(执行生成的DDL命令?)

我正在尝试编写一个命令来删除命名空间中的所有函数。我已经找到了一个可以生成删除函数脚本的命令:

SELECT 'DROP FUNCTION ' || ns.nspname || '.' || proname || '('
     || oidvectortypes(proargtypes) || ');'
FROM pg_proc INNER JOIN pg_namespace ns ON (pg_proc.pronamespace = ns.oid)
WHERE ns.nspname = 'public'  order by proname;
Run Code Online (Sandbox Code Playgroud)

资料来源:http ://www.postgresonline.com/journal/archives/74-How-to-delete-many-functions.html

这将生成类似以下内容的内容:

                 ?column?                 
------------------------------------------
 DROP FUNCTION public.function1(bigint);
 DROP FUNCTION public.function2();
 DROP FUNCTION public.function3(text);
Run Code Online (Sandbox Code Playgroud)

但是,我不知道如何更改代码,以便实际上删除函数 - 而不是仅生成命令。

有任何想法吗?

sql postgresql dynamic-sql plpgsql

4
推荐指数
1
解决办法
3839
查看次数

如何检查哪个函数使用了类型?

我有一个想要更改的类型,但我不知道还有谁在使用它。

如何检查返回此类型的所有函数?

sql postgresql ddl information-schema

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

授予用户ALTER功能的权限

我尝试ALTER使用新用户的函数,我得到错误:

ERROR:  must be owner of function ACases
********** Error **********

ERROR: must be owner of function ACases
SQL state: 42501
Run Code Online (Sandbox Code Playgroud)

我必须给予用户什么权限才能实现ALTER这一功能?我发现的唯一方法是让用户成为OWNER该功能的用户.

但如果是这种情况,只有一个用户(所有者)可以使用ALTER该功能.那么如何更改OWNER所有功能呢?

CREATE OR REPLACE FUNCTION public."ACases"(caseid integer)
  RETURNS boolean AS
$BODY$
DECLARE
BEGIN
        RETURN FALSE;
END;
$BODY$
  LANGUAGE plpgsql;
ALTER FUNCTION public."ACases"(integer) OWNER TO postgres;

GRANT ALL PRIVILEGES ON FUNCTION public."ACases"(integer) TO user_name;
Run Code Online (Sandbox Code Playgroud)

postgresql privileges plpgsql

2
推荐指数
1
解决办法
6978
查看次数