我有以下问题。
SELECT * FROM tgvbn();
ERROR: function tgvbn() does not exist
LINE 1: SELECT * FROM tgvbn();
^
HINT: No function matches the given name and argument types. You might need to add explicit type casts.
Run Code Online (Sandbox Code Playgroud)
由于官方文档的附录 A只说明了 error_codes 和条件名称,而没有说明实际的消息,因此只能猜测“没有函数匹配...”指的是42883 / undefined_function. 我可以设置log_error_verbosity = verbose在postgresql.conf-但会影响日志,不返回到客户端中的消息:
控制在服务器日志中为记录的每条消息写入的详细信息量。
好吧,我可以查阅日志以获取这条信息,但是有没有办法将其包含在错误消息中?
如何连接两个 psql(PostgreSQL 客户端)变量?我想通过连接目录路径变量和文件名变量来生成绝对路径。
我试过这个:
\set path '/tmp/'
\set file 'foo'
\echo :path:file
Run Code Online (Sandbox Code Playgroud)
但是 psql 在路径和文件之间放置了一个空格,并输出:
/tmp/ foo
Run Code Online (Sandbox Code Playgroud) 是否有选项可以更改 psql \e 开关的“退出外部编辑器 -> 查询自动运行”行为?(除了故意修改查询语法)。
我正在开发一个很长的脚本。我想将脚本分解为更小、更易于管理的脚本,并将每个 sql 文件包含在一个主文件中,然后执行主文件。
例子: master.sql
内容(我不知道要使用的语法):
file1.sql
file2.sql
file3.sql
Run Code Online (Sandbox Code Playgroud)
我找到了几个关于psql -f在命令行中使用并\i包含这些文件的教程,但这里的首选项是避免使用终端并使用 GUI 来管理我的数据库并执行master.sql脚本。
这在任何 postgres 管理 GUI 中都可能吗?大概它不在pgAdmin 中。
如何使用 psql 从指定的 Postgres 数据库中获取没有页眉或页脚或其他任何内容的表名?也就是说,如果我有名为“table1”和“table2”的表,那么输出将是:
table1
table2
Run Code Online (Sandbox Code Playgroud)
仅此而已。我一直在尝试各种组合,但看起来它应该比我制作的要容易得多。
我使用 psql-command "\dp" 来找出给定的授权。
测试服务器上的版本:armv7l-unknown-linux-gnueabi 上的 PostgreSQL 9.1.15,由 gcc (Debian 4.6.3-14) 4.6.3 编译,32 位
在 postgres 手册之外:
rolename=xxxx -- privileges granted to a role
=xxxx -- privileges granted to PUBLIC
r -- SELECT ("read")
w -- UPDATE ("write")
a -- INSERT ("append")
d -- DELETE
D -- TRUNCATE
x -- REFERENCES
t -- TRIGGER
X -- EXECUTE
U -- USAGE
C -- CREATE
c -- CONNECT
T -- TEMPORARY
arwdDxt -- ALL PRIVILEGES (for tables, varies for other objects)
* …Run Code Online (Sandbox Code Playgroud) 当我这样做时:
COPY "mytable" FROM '/my/file.csv' WITH DELIMITER AS ',' CSV;
Run Code Online (Sandbox Code Playgroud)
关于这一点:
-rw-r--r-- 1 peter peter 54819176 2011-07-21 13:17 file.csv
Run Code Online (Sandbox Code Playgroud)
psql 告诉我这个:
ERROR: could not open file "/my/file.csv" for reading: Permission denied
Run Code Online (Sandbox Code Playgroud)
我怎样才能读取我的文件?谢谢!
- - 更新
看起来apparmor在 Ubuntu 中默认安装了一个叫做的东西。
似乎与评论中提到的 SELinux 具有相同的功能。
- - 更新
删除后apparmor,我仍然遇到同样的问题。 selinux未安装。
关于下面关于访问的评论,COPY FROM 正在从超级用户帐户运行(如果没有,它会给出不同的错误消息)和上面复制的文件权限,我理解为“每个人都可读”。
- - 更新
我试图访问postgres用户下的文件。它卡在树的特定位置
drwxr--r-- 6 peter peter 4096 2011-04-14 14:03 phm
postgres@dexter:/home/peter/PyPacks$ cd phm
bash: cd: phm: Permission denied
我想我会把文件放在其他地方,但这很奇怪!
我正在使用 psql 工具:
命令:
my_db=# \ddp
Run Code Online (Sandbox Code Playgroud)
结果:
Default access privileges
Owner | Schema | Type | Access privileges
----------------+--------+----------+--------------------------------------
postgres | kpi | function | kpi_updater=X/postgres +
| | | intranet2=X/postgres
postgres | kpi | sequence | kpi_updater=rwU/postgres +
| | | intranet2=rwU/postgres
postgres | kpi | table | kpi_updater=arwdDxt/postgres +
| | | intranet2=arwdDxt/postgres
postgres | kpi | type | kpi_updater=U/postgres +
| | | intranet2=U/postgres
Run Code Online (Sandbox Code Playgroud)
接下来,我使用以下命令,返回没有错误:
ALTER DEFAULT PRIVILEGES IN SCHEMA kpi REVOKE EXECUTE ON FUNCTIONS FROM intranet2; …Run Code Online (Sandbox Code Playgroud) psql 13.2 退出编辑器时,无论退出编辑器后如何,都会执行查询缓冲区 - 在这种情况下,缓冲区现在可能保存最近执行的 SQL 查询。
重现:
vim使用\e或\e filename从psql控制台启动编辑器(在我的情况下)。:q(或:q!强制)预期行为:回到启动编辑器之前的状态。(我取消了编辑!)
观察到的行为:重新执行上次执行的 SQL 查询。
似乎发生了什么\e:
它执行(相当于)\p,因此当前查询缓冲区包含前一个命令,当它为空时。(编辑文件时用户看不到!)
手册\p :
\p或者将当前查询缓冲区打印到标准输出。如果当前查询缓冲区为空,则打印最近执行的查询。
启动编辑器。如果提供了文件名,则加载文件,否则加载查询缓冲区。
如果编辑器以写入结束,则将结果复制到查询缓冲区。
如果编辑被取消(:q在 vim 中),不要覆盖查询缓冲区。(它现在保存了之前的命令!)
执行查询缓冲区。或者,准确地说,这样做:
行为似乎可以\p(只是复制查询缓冲区,没有造成任何伤害),但不能\e执行,它可以执行我什至没有看到的命令。
这是一个错误吗?
无论哪种方式,我至少想在离开编辑器时禁用自动执行。但这似乎不可能。或者我错过了什么?
我需要能够从.sql使用 .bashrc 执行文件的 bash shell 传递环境变量psql。
psql我正在运行的命令是:
su postgres -c "psql -v ON_ERROR_STOP=1 -v dbname=example -v dbuser=example -e" < ./create-db.sql
Run Code Online (Sandbox Code Playgroud)
我放置的位置example通常分别设置为$DATABASE_NAME和DATABASE_USER,在执行命令之前在 bash 脚本中设置psql。
该create-db.sql文件是:
\connect postgres
DROP DATABASE IF EXISTS :dbname;
DO $$BEGIN
CREATE USER :dbuser;
EXCEPTION WHEN duplicate_object THEN
RAISE NOTICE 'user already exists';
END$$;
ALTER ROLE :"dbuser" SET search_path TO :"dbname",public;
CREATE DATABASE :"dbname"
OWNER=:dbuser
ENCODING=UTF8
LC_COLLATE='en_US.UTF-8'
LC_CTYPE='en_US.UTF-8'
TEMPLATE=template0;
\connect :"dbname"
CREATE SCHEMA …Run Code Online (Sandbox Code Playgroud)