小编vol*_*ron的帖子

PostgreSQL:DBLink 奇怪的权限/连接错误

目标是 (1)创建一个连接,(2)返回另一个数据库的视图,以及 (3)关闭所有要存储在视图中的同一个连接(没有存储过程或嵌入式密码)。我想出了以下代码,它使用信任帐户并且似乎可以工作,直到过滤布尔字段。搜索false(field=false) 有效,但搜索true(field=true) 或IS NOT NULL提示输入密码。

返回数据时不需要密码真的很奇怪,但是在过滤时,那就是需要密码的时候。


PostgreSQL: v8.4:

  • 有两个数据库:db_remotedb_local
  • 有两个账户:
    • trust_user(在 pg_hba.conf 中设置为对两个数据库的信任
    • md5_user(在 pg_hba.conf 中设置为两个数据库的md5
  • db_remote 有一个视图 ( v_sessions),它包含两个字段:文本字段和布尔字段,它是用CASE语句创建的。

从 db_local(作为 md5_user)中:

-- Creates okay:
CREATE VIEW v_sessions AS 
SELECT * FROM (
     select  '1' query_type,'' as username, false as is_logged_in 
     from    dblink_connect_u('connection', 'host=development dbname=db_remote user=trusted_user') 
     union 
     select  '2' query_type, username, is_logged_in 
     from …
Run Code Online (Sandbox Code Playgroud)

postgresql dblink

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

如何查看 PostgreSQL 事务中更改的元组?

BEGIN;

   INSERT INTO foo_table(foo_column) VALUES('a'),('b'),('c');

   -- SELECT * FROM pg_stat_activity WHERE ...
   -- shows records with a flag if they have been added/deleted/updated

END;
Run Code Online (Sandbox Code Playgroud)

有没有办法查看 PostgreSQL 9.x 中给定表的事务未提交的插入/删除?这纯粹是为了视觉确认。

虽然我最初的想法是否定的(只对表执行 SQL-Select),但某些用户想要可视化事务中的差异。如果有很多保存点和事务,我可以看到这会有什么帮助。因此,值得向整个社区询问。

postgresql transaction

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

对表中所有基于文本的字段使用 NOT NULL 约束的共识是什么?

我遇到的一些表没有任何NOT NULL约束,这在查询时产生了一些问题。

我很好奇使用类似的东西是什么感觉NOT NULL DEFAULT '',它会coalesce()在检索/过滤记录时取代函数的需要。另一方面,不是合并,你必须使用CASE语句,或者,如果你仍然想使用合并,你会做类似的事情coalesce(nullif(field_foo,''), field_bar)

mysql postgresql performance

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

创建视图时关闭表名的自动限定

问题定义

我正在尝试修改共享开发数据库,​​供开发团队用于应用程序开发/测试。

大多数集体工作(表名、视图等)都存储在公共环境中模式中,但我已经为每个用户设置了模式以用作临时空间。然而,真正的目标是用户使用其架构中的对象(如果存在),然后依赖其他对象,就像今天使用 search_path 的方式一样。

例子

用一个例子可能会更好地描述这一点。假设团队正在开发一个汽车维修应用程序的数据库,其中包含一些表和视图:

public.automobiles
public.parts
public.inventory
public.mechanics
public.schedule
public.v_repairs  -- view that joins fields from all tables above
Run Code Online (Sandbox Code Playgroud)

这非常有效,但假设开发人员(例如 Sally)想要测试一项新功能,用她自己的数据集来检查视觉反馈或阈值测试。她在自己的架构中创建了一个表sally.schedule。因为默认的search_path类似于"$user",public,所以她创建的任何简单查询都会在公开之前首先检查她的架构。例如:

SELECT * FROM schedule LEFT JOIN mechanics USING(mechanic_id);
Run Code Online (Sandbox Code Playgroud)

当 sally 连接到数据库时,这将使用 public.mechanics 和 sally.schedule。这正是预期的用途,但是在保存视图时,它通过插入架构来完全限定表名称。因此,如果将上面相同的查询创建为公共模式中的视图,它将如下所示:

SELECT * FROM public.schedule LEFT JOIN public.mechanics USING(mechanic_id);
Run Code Online (Sandbox Code Playgroud)

search_path 的魔力被否定了。当Sally连接到数据库调用视图时(SELECT * FROM v_mechanics_schedule ) 时,它会忽略她创建的 sally.schedule 表,而只使用公共表。

有没有办法在保存视图时不让 Postgres 存储表/视图对象的架构名称?


注意:这是我正在研究的新事物,但我从未真正需要过它,因为开发人员通常可以克隆应用程序、复制数据库并在自己的沙箱环境中工作。不需要一些巧妙的协作模式设置

postgresql database-design execution-plan view

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