小编dez*_*zso的帖子

授予用户访问所有表的权限

我是 Postgres 的新手,正在尝试迁移我们的 MySQL 数据库。在 MySQL 中,我可以向低特权用户授予SELECTUPDATEINSERTDELETE特权,并使这些授权适用于指定数据库中的所有表。我一定在 Postgres 中遗漏了一些东西,因为看起来我必须一次为每个表授予这些权限。有许多数据库,每个数据库有数百个表,这似乎是一项艰巨的任务,只是为了起步。此外,一旦数据库开始运行,添加表的频率就足够高了,除非绝对必要,否则我不想每次都授予权限。

这是如何最好地完成的?

postgresql best-practices postgresql-9.1

182
推荐指数
5
解决办法
46万
查看次数

如何插入包含外键的行?

使用 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 foreign-key insert postgresql-9.1

77
推荐指数
3
解决办法
37万
查看次数

PostgreSQL 中的 DELETE 非常慢,解决方法?

我在 PostgreSQL 9.2 上有一个数据库,它有一个包含大约 70 个表的主模式和可变数量的相同结构的每个客户端模式,每个模式有 30 个表。客户端模式具有引用主模式的外键,而不是相反。

我刚刚开始用一些从以前版本中获取的真实数据填充数据库。当我不得不在主模式的一个非常中心的表中进行批量删除时,数据库已经达到大约 1.5 GB(预计在几周内会增长到几十 GB)。所有相关的外键都标记为 ON DELETE CASCADE。

这将需要很长时间,这并不奇怪,但 12 小时后很明显,我最好重新开始,删除数据库并再次启动迁移。但是,如果我稍后需要在数据库处于活动状态且更大时重复此操作怎么办?有没有替代的、更快的方法?

如果我编写一个脚本来浏览依赖表,从离中心表最远的表开始,逐表删除依赖行,会快得多吗?

一个重要的细节是某些表上有触发器。

postgresql performance delete postgresql-9.2

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

存储过程的单元测试

我已经考虑这个问题很久了。

基本问题是:如何对存储过程进行单元测试?

我发现我可以相对轻松地为经典意义上的函数设置单元测试(我的意思是它们获得零个或多个参数并返回一个值)。但是,如果我考虑一个看似简单的过程在某处插入一行的真实示例,在插入之前或之后有几个触发器执行此操作,甚至定义“单元”的边界也非常困难。我应该只测试INSERT本身吗?我认为这相当简单——价值相对较低。我应该测试整个事件链的结果吗?除了这是否是单元测试的问题外,设计一个合适的测试可能是一项非常艰巨的工作,在此过程中会出现许多额外的问号。

然后是不断变化的数据的问题。在UPDATE影响的不仅仅是几行的情况下,每个可能受影响的行都必须以某种方式包含在测试用例中。DELETEs 等等的进一步困难。

那么如何对存储过程进行单元测试呢?复杂性中是否存在一个完全没有希望的门槛?维护需要哪些资源?

编辑还有一个小问题,基于 AlexKuznetsov 的回答:或者是否存在一个完全无用的阈值?

best-practices unit-test

44
推荐指数
4
解决办法
3万
查看次数

如何查看Oracle中的数据库列表?

是否有等效于 MySQL 的SHOW DATABASES语句?

是否可以在集群中找到数据库?即存在于其他系统上的网络上的数据库?

我可以分析 Oracle 安装中存在的文件以找到相同的文件吗?

给定对 Oracle 系统的完整访问凭证,您将如何枚举存在的所有数据库?

oracle

41
推荐指数
5
解决办法
31万
查看次数

Postgres 中的权限被拒绝

我将用户添加myuser到 Postgres。

然后我mydatabase在 pgAdmin III GUI 中添加了数据库并从备份文件中恢复。所以拥有者mydatabase是超级用户postgres

然后我试图给所有的访问权和修改mydatabasemyuser。我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用来记录,但如果我尝试一个简单的查询,我会得到这个错误:

ERROR:  permission denied for relation table_name
Run Code Online (Sandbox Code Playgroud)

我错过了什么吗?你能帮我解决吗?

postgresql permissions

34
推荐指数
2
解决办法
14万
查看次数

与 varchar(255) 相比,使用 varchar(5000) 会不会很糟糕?

由于varchar无论如何动态分配空间,我的问题是varchar(255)与使用varchar(5000). 如果是,为什么?

sql-server

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

使用多个由逗号分隔的外键是否错误,如果是,为什么?

有两个表:DealDealCategories。一笔交易可以有多个交易类别。

所以正确的方法应该是制作一个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)

我觉得他们这样做是错误的,但我不知道如何清楚地解释为什么这是不对的。

我该如何向他们解释这是错误的?或者也许是错了,这是可以接受的?

foreign-key database-design

32
推荐指数
1
解决办法
7082
查看次数

将 postgresql 数据移动到不同的驱动器

我使用 AWS 作为我的云环境。我将 PostgreSQL 安装在与根实例卷相同的驱动器上。我已将第二个驱动器连接并安装到我的实例上。现在我想将我所有的 PostgreSQL 数据移动到不同的驱动器。我仍处于开发模式,因此如果此时可以更轻松地传输旧数据,我可以删除旧数据。做这个的最好方式是什么?

PostgreSQL 表空间是我应该看的东西吗?

postgresql tablespaces postgresql-9.1

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

如何在只有 IDENTITY 列的表中插入?

给定一个只有 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 列。它不是用于生产。否则,这样的表可以用作序列生成器,不需要其他列。

sql-server identity

22
推荐指数
1
解决办法
7270
查看次数