小编Joh*_*han的帖子

在不同的所有者下创建数据库

我正在尝试在 Postgres 中设置一个角色,它可以 a) 创建一个新角色 b) 创建一个新数据库 c) 使该新角色成为数据库的所有者 d) 没有其他权限(尽可能!)

我试过这个:

sc_1=# CREATE ROLE tenant_admin CREATEDB CREATEROLE;
CREATE ROLE
sc_1=# CREATE ROLE user1 IN ROLE tenant_admin LOGIN NOINHERIT ENCRYPTED PASSWORD 'xyz';
CREATE ROLE
sc_1=# 
Run Code Online (Sandbox Code Playgroud)

其次是(在另一个会话中)

tahaan@Komputer:~/projects/acme-project$ psql -U user1 -h localhost -d postgres
Password for user user1: 
psql (9.3.6)
SSL connection (cipher: DHE-RSA-AES256-SHA, bits: 256)
Type "help" for help.

postgres=> SET ROLE tenant_admin;
SET                                                                                                                     
postgres=> CREATE DATABASE "Tenant1" TEMPLATE "tenant_template";
CREATE DATABASE
postgres=> CREATE ROLE "owner1";
CREATE ROLE
postgres=> …
Run Code Online (Sandbox Code Playgroud)

postgresql security permissions

8
推荐指数
2
解决办法
4万
查看次数

在单个查询中对单个表进行两次计数

论坛上有一些类似的问题/答案,但我认为我的问题更简单。

我有两个问题,例如

SELECT count(*) FROM agent;
SELECT count(*) FROM agent WHERE active = 't';
Run Code Online (Sandbox Code Playgroud)

我希望输出在一行上。对于奖励积分,最好只扫描一次表格并更新两个计数器,以获得这样的结果

active_agents | total_agents
--------------+--------------
    10        |     20
Run Code Online (Sandbox Code Playgroud)

所以我想我有两个问题:
最简洁/最清晰的方法是什么,以及
对于非常大的表格,最快的方法是什么。

postgresql

6
推荐指数
2
解决办法
5983
查看次数

行级安全或多个表

我正在寻找有关以下场景的最佳实践的文档。

托管应用程序包含一些“全局”数据和一些“每租户”数据。“租户”不应该访问另一个租户的表,我希望在 DBMS 级别强制执行此操作(除了强制执行到应用程序级别)。

因此,作为示例,该应用程序可以向视频租赁商店提供管理系统。

店主和员工以及与租借电影的人有关的信息是全球性的。一旦客户注册,他们就无需再次注册从另一家商店租用。

商店(租户)有自己的数据库(客户列表、库存、当前预订的电影等)。因此,当店主登录应用程序时,只显示他自己的数据,我对此没有意见。

系统是否应该为每个租户/商店创建一组新表?

或者系统是否应该使用 DBMS 安全/授权...换句话说,在后端,商店 1 的库存与商店 2 的库存在同一表中,但通过 DBMS 安全性,视图只允许为谁选择该商店的行用户已登录应用程序。

我不确定我的问题是否足够清楚?

security database-design row-level-security

5
推荐指数
1
解决办法
1409
查看次数

将列添加到现有表是不好的做法吗?

相反:在创建新表时获取所有列是否更好?

我正在开发一个新系统,而且新的要求一直在出现。最新的要求是为每个客户添加一个新的标签字段,以便更容易在新旧系统之间关联数据。新系统尚未投入生产,但已经完成了迁移过程的一些测试运行。

目前,删除表并重新运行批量加载仍然可行,但未来如何 - 当系统中有大量实时数据并且出现对新列的需求时:它对例如,要导出数据,重新创建包含所有列的表,然后再次导入数据,而不仅仅是执行 ALTER TABLE ADD 列......?

如果它有任何不同,该解决方案基于 PostgreSQL 9.5,如果它确实有所不同,那么了解哪些 DBMS 或多或少关心会很有趣。

是否在此列上创建索引会影响答案?例如,当设置了唯一约束时。

postgresql database-design alter-table

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

按条件计算物品

在用户可以在多个设备上安装移动应用程序副本的应用程序中,我想知道每个用户拥有多少个 iphone 和多少个 android 应用程序。

我尝试了一个查询,例如

gv2=> SELECT userid, 
       COUNT(ALL version_identifier LIKE '%ios%'), 
       COUNT(ALL version_identifier LIKE '%android%') 
FROM gl.user_device 
GROUP BY userid;
                userid                | count | count 
--------------------------------------+-------+-------
 46d0f5b7-42b0-4aad-9162-1390c32cb06e |     7 |     7
 5d519794-abfe-4863-82d4-6da33db7637b |     7 |     7
 a81cff6b-30f2-4b6e-a5bf-b1a933904473 |     1 |     1
 b65f0708-0cd1-11e7-878b-06fa189da46b |     4 |     4
 94b91b02-ff43-4a9a-b317-037fa2a347d3 |     1 |     1
 a4cacd98-1216-4801-b058-b28b8fa632a9 |     8 |     8
(6 rows)
Run Code Online (Sandbox Code Playgroud)

这显然是错误的。

例如

gv2=> SELECT userid FROM gl.user_device WHERE version_identifier LIKE '%ios%';
                userid                
--------------------------------------
 5d519794-abfe-4863-82d4-6da33db7637b
(1 row)
Run Code Online (Sandbox Code Playgroud)

万一我需要支持 Postgres 10.1,但最好也支持 9.5.10,因为我有一个旧的生产数据库仍然在那个版本上。

postgresql count

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