小编Vér*_*ace的帖子

我如何为所有模式中的所有表授予权限

我想要

GRANT SELECT
    ON ALL TABLES
    TO foo;
Run Code Online (Sandbox Code Playgroud)

但是 postgres 告诉我“TO”有一个语法错误。它期望像这样的 GRANT:

GRANT SELECT
    ON ALL TABLES
    IN SCHEMA public
    TO foo;
Run Code Online (Sandbox Code Playgroud)

我们已经碎片化,使得表了一把publicshard123shard124一切有一个表my_table,并public.my_table为双方的父母shard123.my_tableshard124.my_table。对于公共模式,我已将 SELECT 授予 foo,但 foo 没有任何分片模式的权限。

我也做过:

ALTER DEFAULT PRIVILEGES
    FOR ROLE dba
    GRANT SELECT
    ON TABLES
    TO foo;
Run Code Online (Sandbox Code Playgroud)

...它应该自动授予从现在开始创建的任何新表和模式。

有 1000 < n < 10000 个分片/模式,因此为每个分片/模式单独授予是不切实际的。

如何为所有现有模式(所有分片)中的所有现有表授予角色?

或者更好的是,我可以为所有模式 GRANTLIKE 'shard%'吗?

permissions postgresql-9.2

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

SQL AlwaysOn 和系统中心配置管理器 TP 4 1601

最近,Microsoft 发布了 Configuration Manager (1601) 的技术预览版 4。根据 TechNet,“Configuration Manager 现在支持使用 SQL Server AlwaysOn 可用性组来托管站点数据库。安装新站点时,您可以直接安装以使用可用性组而不是 SQL Server 的普通实例。”

然后他们注意到“可用性组的成功配置和使用要求您熟悉配置 SQL Server 可用性组,并依赖于 SQL Server 文档库中提供的文档和过程。”

目前,为 Configuration Manager 站点数据库创建容错和避免单点故障的最佳做法是在每个管理点安装 SQL 副本。我观看了几个概述视频(从 2013 年开始)以更好地了解 AlwaysOn 的工作原理。

在 DBA 社区中,AlwaysOn 是提供容错和避免 SQL 副本单点故障的更好解决方案吗?

完全披露者:我正在学习配置管理器并且对 SQL Server 有非常基本的了解,因此您的任何建议或建议将不胜感激。

sql-server high-availability availability-groups

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

mysqldump 生成不正确的创建视图查询

我使用 mysqlpump 来备份数据库:

mysqlpump --single-transaction --add-drop-database --skip-definer \ --databases mydatabase --result-file /opt/myservice/backup/export.sql

我的数据库包含多个视图,其中一些视图在 CREATE VIEW 查询中使用完全错误的 SELECT 导出,如下所示:

CREATE VIEW `careerpulse-staging`.`user_view` AS SELECT
 1 AS `id`,
 1 AS `name`,
 1 AS `department`,
 1 AS `manager_id`
;
Run Code Online (Sandbox Code Playgroud)

为什么会发生这种情况?我该如何解决?

mysqldump mysql-5.7

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

将 .csv 值匹配为 INT。如果 .csv 中某个组中的一个值与另一组中的一个值匹配,则合并字符串

这里我们有两组数字。问题是我无法弄清楚如何从数字的输入到输出(下面的 DDL 和 DML 以及这里的小提琴)。

current_data
1,2,3
1,4
1,5,7
8,9,10
10,11,15

expected_outcome
1,2,3,4,5,7
8,9,10,11,15
Run Code Online (Sandbox Code Playgroud)

我们只是尝试根据单个数字是否与任何其他组匹配来匹配一组数字。然后合并所有这些组。

例如。

如果我们有:

('1,2,3'),
('1,4'),
('1,5,7')
Run Code Online (Sandbox Code Playgroud)

我们想要:

(1,2,3,4,5,7)
Run Code Online (Sandbox Code Playgroud)

我们将它们合并为 PostgreSQL 中的一行。

或(另一个例子):

('8,9,10'), 
('10,11,15')
Run Code Online (Sandbox Code Playgroud)

所需的输出:

(8,9,10,11,15)
Run Code Online (Sandbox Code Playgroud)

查询将对这些数字进行分组,因为它们的共同点是数字 10。但它不会与(1,2,3,4,5,7)不共享数字的前一行(即)分组。

当我们将这些组放在一张表中时。如果他们在每一组中至少有一个匹配的号码,他们才会分组在一起。

======== DDL 和 DML ============

create table current (current_data text not null);
create table expected_output (expected_outcome text not null);

insert into current (current_data) values ('1,2,3'),('1,4'),('1,5,7'),('8,9,10'), ('10,11,15');
insert into expected_output (expected_outcome) values ('1,2,3,4,5,7'),('8,9,10,11,15');
Run Code Online (Sandbox Code Playgroud)

postgresql array string string-splitting string-searching

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

PostgreSQL 中的子查询魔法

我有一个疑问:

update product_product 
set (write_date, default_code) = (LOCALTIMESTAMP, 'update') 
where product_tmpl_id in (
    select distinct product_tmpl_id 
    from product_template 
    where type='import');
Run Code Online (Sandbox Code Playgroud)

而且需要7个小时才能完成。但是,当我执行子查询时:

select distinct product_tmpl_id 
from product_template 
where type='import';
Run Code Online (Sandbox Code Playgroud)

我收到错误:

列“product_tmpl_id”不存在

product_tmpl_id表中没有列product_template

这是我的错误。第一个查询应该是:

update product_product set (write_date,default_code) = (LOCALTIMESTAMP,'update') 
where product_tmpl_id in
 (select distinct id from product_template where type='import');
Run Code Online (Sandbox Code Playgroud)

它只需要几秒钟即可运行。

所以我的问题如下:

  • 为什么第一个查询没有失败?
  • 为什么要运行这么长时间?
  • 它到底做了什么?

结果select version();

PostgreSQL 9.4.3 on x86_64-unknown-linux-gnu, 
compiled by gcc (Debian 4.9.2-10) 4.9.2, 64-bit
Run Code Online (Sandbox Code Playgroud)

postgresql subquery postgresql-9.4

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

查询每月有 group_concat 和 group by 需要帮助

我被困在一个连接表查询上,每月显示涉及 GROUP BY 和 GROUP_CONCAT 的数据。

这是一个简单的客户端表(本文底部的 DDL 和 DML):

id | Name
1  | Sony
2  | Toshiba
3  | Apple
4  | LG
5  | Uco
Run Code Online (Sandbox Code Playgroud)

然后是事件表

id | client_id | date_start
1 | 1 | 2017-01-12 18:44:42
2 | 1 | 2017-01-13 18:44:42
3 | 1 | 2017-01-14 18:44:42
4 | 1 | 2017-02-12 18:44:42
5 | 1 | 2017-03-12 18:44:42
6 | 1 | 2017-07-12 18:44:42
7 | 2 | 2017-02-12 18:44:42
8 | 2 | …
Run Code Online (Sandbox Code Playgroud)

mysql pivot group-by group-concatenation

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

为 WHERE COALESCE() 条件创建索引

我使用的是 PostgreSQL V9.6.11

表DDL:

CREATE TABLE test_c ( 
          insrt_prcs_id bigint NOT NULL, 
          updt_prcs_id bigint, src_sys_id integer NOT NULL,
          load_dttm timestamp(6) with time zone NOT NULL, 
          updt_dttm timestamp(6) without time zone);

Run Code Online (Sandbox Code Playgroud)

我试图index为下面的查询创建一个:

SELECT * 
FROM test_c             
WHERE COALESCE(u_dttm,l_dttm) > '2020-04-10 15:29:44.596311-07'
AND   COALESCE(u_dttm,l_dttm) <= '2020-04-11 15:29:44.596311-07' 
Run Code Online (Sandbox Code Playgroud)

创建index为:

create index idx_test_c  on test_c(COALESCE((updt_dttm, load_dttm)))
Run Code Online (Sandbox Code Playgroud)

但查询计划器没有扫描索引:

EXPLAIN ANALYZE
SELECT *            
FROM test_c             
WHERE COALESCE(u_dttm,l_dttm) > '2020-04-10 15:29:44.596311-07'
AND   COALESCE(u_dttm,l_dttm) <= '2020-04-11 15:29:44.596311-07' 
Run Code Online (Sandbox Code Playgroud)
Seq Scan on test_c as test_c (cost=0..1857.08 …
Run Code Online (Sandbox Code Playgroud)

postgresql index coalesce postgresql-9.6

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

是否有可能在 PostgreSQL 中永远不运行 Vacuum Full

由于aVACUUM FULL锁表,这对于我们的生产环境来说是不可接受的。

是否可以只在生产系统上运行VACUUM而不运行?VACUUM FULL

是否可以VACUUM让空间重新用于新的INSERT用途?

postgresql locking vacuum

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

快速从 PostgreSQL 表中获取真正的 RANDOM 行

我以前总是这样做:

SELECT column FROM table ORDER BY random() LIMIT 1;
Run Code Online (Sandbox Code Playgroud)

对于大表,这令人难以忍受,慢得令人难以置信,以至于在实践中毫无用处。这就是为什么我开始寻找更有效的方法。人们推荐:

SELECT column FROM table TABLESAMPLE BERNOULLI(1) LIMIT 1;
Run Code Online (Sandbox Code Playgroud)

虽然速度很快,但它也提供了毫无价值的随机性。它似乎总是选择相同的该死的记录,所以这也毫无价值。

我也试过:

SELECT column FROM table TABLESAMPLE BERNOULLI(100) LIMIT 1;
Run Code Online (Sandbox Code Playgroud)

它提供了更糟糕的随机性。它每次都选择相同的几条记录。这是完全没有价值的。我需要实际的随机性。

为什么仅选择随机记录显然如此困难?为什么它必须抓取每条记录然后对它们进行排序(在第一种情况下)?为什么“TABLESAMPLE”版本总是抓取相同的愚蠢记录?为什么它们不是随机的?当它一遍又一遍地选择相同的几条记录时,谁会想要使用这个“BERNOULLI”的东西?我不敢相信,经过这么多年,我仍然在询问随机记录……这是最基本的查询之一。

用于从 PG 中的表中抓取随机记录的实际命令是什么,该命令并没有慢到需要几秒钟才能获得一个体面大小的表?

postgresql random select postgresql-performance

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

是否可以在 MySQL 5.7 中自动生成 Unix 毫秒时间戳

我在 MySQL 5.7 表中创建了一个created_time字段BIGINT,现在我想在插入记录时自动生成一个 Unix 毫秒时间戳。是否有可能做到这一点?我尝试了下面的代码,但失败了:

ALTER TABLE db.video_info MODIFY COLUMN created_time bigint(20) 
  DEFAULT (ROUND(UNIX_TIMESTAMP(CURTIME(4)) * 1000)) NULL;
Run Code Online (Sandbox Code Playgroud)

mysql timestamp default-value

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