我是 Postgres 的新手,正在尝试迁移我们的 MySQL 数据库。在 MySQL 中,我可以向低特权用户授予SELECT、UPDATE、INSERT和DELETE特权,并使这些授权适用于指定数据库中的所有表。我一定在 Postgres 中遗漏了一些东西,因为看起来我必须一次为每个表授予这些权限。有许多数据库,每个数据库有数百个表,这似乎是一项艰巨的任务,只是为了起步。此外,一旦数据库开始运行,添加表的频率就足够高了,除非绝对必要,否则我不想每次都授予权限。
这是如何最好地完成的?
使用 PostgreSQL v9.1。我有以下表格:
CREATE TABLE foo
(
id BIGSERIAL NOT NULL UNIQUE PRIMARY KEY,
type VARCHAR(60) NOT NULL UNIQUE
);
CREATE TABLE bar
(
id BIGSERIAL NOT NULL UNIQUE PRIMARY KEY,
description VARCHAR(40) NOT NULL UNIQUE,
foo_id BIGINT NOT NULL REFERENCES foo ON DELETE RESTRICT
);
Run Code Online (Sandbox Code Playgroud)
假设第一个表foo是这样填充的:
INSERT INTO foo (type) VALUES
( 'red' ),
( 'green' ),
( 'blue' );
Run Code Online (Sandbox Code Playgroud)
有没有办法bar通过引用foo表轻松插入行?或者我必须分两步完成,首先查找foo我想要的类型,然后在其中插入一个新行bar?
这是一个伪代码示例,显示了我希望可以完成的工作:
INSERT INTO bar (description, foo_id) VALUES
( …Run Code Online (Sandbox Code Playgroud) 我在 PostgreSQL 9.2 上有一个数据库,它有一个包含大约 70 个表的主模式和可变数量的相同结构的每个客户端模式,每个模式有 30 个表。客户端模式具有引用主模式的外键,而不是相反。
我刚刚开始用一些从以前版本中获取的真实数据填充数据库。当我不得不在主模式的一个非常中心的表中进行批量删除时,数据库已经达到大约 1.5 GB(预计在几周内会增长到几十 GB)。所有相关的外键都标记为 ON DELETE CASCADE。
这将需要很长时间,这并不奇怪,但 12 小时后很明显,我最好重新开始,删除数据库并再次启动迁移。但是,如果我稍后需要在数据库处于活动状态且更大时重复此操作怎么办?有没有替代的、更快的方法?
如果我编写一个脚本来浏览依赖表,从离中心表最远的表开始,逐表删除依赖行,会快得多吗?
一个重要的细节是某些表上有触发器。
我已经考虑这个问题很久了。
基本问题是:如何对存储过程进行单元测试?
我发现我可以相对轻松地为经典意义上的函数设置单元测试(我的意思是它们获得零个或多个参数并返回一个值)。但是,如果我考虑一个看似简单的过程在某处插入一行的真实示例,在插入之前或之后有几个触发器执行此操作,甚至定义“单元”的边界也非常困难。我应该只测试INSERT本身吗?我认为这相当简单——价值相对较低。我应该测试整个事件链的结果吗?除了这是否是单元测试的问题外,设计一个合适的测试可能是一项非常艰巨的工作,在此过程中会出现许多额外的问号。
然后是不断变化的数据的问题。在UPDATE影响的不仅仅是几行的情况下,每个可能受影响的行都必须以某种方式包含在测试用例中。DELETEs 等等的进一步困难。
那么如何对存储过程进行单元测试呢?复杂性中是否存在一个完全没有希望的门槛?维护需要哪些资源?
编辑还有一个小问题,基于 AlexKuznetsov 的回答:或者是否存在一个完全无用的阈值?
是否有等效于 MySQL 的SHOW DATABASES语句?
是否可以在集群中找到数据库?即存在于其他系统上的网络上的数据库?
我可以分析 Oracle 安装中存在的文件以找到相同的文件吗?
给定对 Oracle 系统的完整访问凭证,您将如何枚举存在的所有数据库?
我将用户添加myuser到 Postgres。
然后我mydatabase在 pgAdmin III GUI 中添加了数据库并从备份文件中恢复。所以拥有者mydatabase是超级用户postgres。
然后我试图给所有的访问权和修改mydatabase来myuser。我psql以用户身份登录postgres:
psql -d template1 -U postgres
Run Code Online (Sandbox Code Playgroud)
然后我运行了这个查询:
GRANT ALL PRIVILEGES ON DATABASE mydatabase TO myuser
Run Code Online (Sandbox Code Playgroud)
现在我可以myuser用来记录,但如果我尝试一个简单的查询,我会得到这个错误:
Run Code Online (Sandbox Code Playgroud)ERROR: permission denied for relation table_name
我错过了什么吗?你能帮我解决吗?
由于varchar无论如何动态分配空间,我的问题是varchar(255)与使用varchar(5000). 如果是,为什么?
有两个表:Deal和DealCategories。一笔交易可以有多个交易类别。
所以正确的方法应该是制作一个DealCategories具有以下结构的表:
DealCategoryId (PK)
DealId (FK)
DealCategoryId (FK)
Run Code Online (Sandbox Code Playgroud)
但是,我们的外包团队以Deal这种方式将多个类别存储在表中:
DealId (PK)
DealCategory -- In here they store multiple deal ids separated by commas like this: 18,25,32.
Run Code Online (Sandbox Code Playgroud)
我觉得他们这样做是错误的,但我不知道如何清楚地解释为什么这是不对的。
我该如何向他们解释这是错误的?或者也许是我错了,这是可以接受的?
我使用 AWS 作为我的云环境。我将 PostgreSQL 安装在与根实例卷相同的驱动器上。我已将第二个驱动器连接并安装到我的实例上。现在我想将我所有的 PostgreSQL 数据移动到不同的驱动器。我仍处于开发模式,因此如果此时可以更轻松地传输旧数据,我可以删除旧数据。做这个的最好方式是什么?
PostgreSQL 表空间是我应该看的东西吗?
给定一个只有 IDENTITY 列的表,如何插入新行?我尝试了以下方法:
INSERT INTO TABLE
(Syntax error)
INSERT INTO TABLE VALUES()
(Syntax error)
INSERT INTO TABLE (Id) VALUES()
(Syntax error)
Run Code Online (Sandbox Code Playgroud)
我正在测试一些东西,只需要 IDENTITY 列。它不是用于生产。否则,这样的表可以用作序列生成器,不需要其他列。
postgresql ×5
foreign-key ×2
sql-server ×2
delete ×1
identity ×1
insert ×1
oracle ×1
performance ×1
permissions ×1
tablespaces ×1
unit-test ×1