我想要
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)
我们已经碎片化,使得表了一把public,shard123和shard124一切有一个表my_table,并public.my_table为双方的父母shard123.my_table和shard124.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%'吗?
最近,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 有非常基本的了解,因此您的任何建议或建议将不胜感激。
我使用 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)
为什么会发生这种情况?我该如何解决?
这里我们有两组数字。问题是我无法弄清楚如何从数字的输入到输出(下面的 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) 我有一个疑问:
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) 我被困在一个连接表查询上,每月显示涉及 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) 我使用的是 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) 由于aVACUUM FULL锁表,这对于我们的生产环境来说是不可接受的。
是否可以只在生产系统上运行VACUUM而不运行?VACUUM FULL
是否可以VACUUM让空间重新用于新的INSERT用途?
我以前总是这样做:
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 中的表中抓取随机记录的实际命令是什么,该命令并没有慢到需要几秒钟才能获得一个体面大小的表?
我在 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)