今天我了解了GRANT REFERENCES. 在多年的 SQL 管理和开发工作中,我从未听说过它,也从未遇到过问题。
REFERENCES 启用外键创建。级别:全局、数据库、表、列。
REFERENCES 要创建外键约束,必须对引用列和被引用列都具有此权限。可以为表的所有列或仅特定列授予特权。
是GRANT REFERENCES唯一的有关创建一个外键约束?在什么业务案例中禁止创建外键约束(但允许创建表)有意义?你能给我举个真实世界的例子吗?
mysql postgresql foreign-key permissions referential-integrity
我是数据库的新手,我对交易迷路了。例如,在我有一个sensor_log不断接收 INSERT的表的情况下,我想在一个事务中将数据移动到另外两个表。
BEGIN;
INSERT INTO sensor_log_a
SELECT id, location
FROM sensor_log
INNER JOIN sensor_location_to_insert USING (location);
INSERT INTO sensor_log_b
SELECT id, location
FROM sensor_log
INNER JOIN sensor_location_to_insert USING (location);
COMMIT;
Run Code Online (Sandbox Code Playgroud)
如果在事务期间插入数据或BEGIN;..COMMIT;防止这种情况发生,是否存在数据在 sensor_log_a 和 sensor_log_b 之间不同的风险?
当使用 pgAdmin 4(实际上是其他几个充当数据库客户端的程序)时,与服务器的连接在闲置 10 或 15 分钟后断开。一杯咖啡和一个电话,您会收到一条类似于“抱歉,与数据库的连接已丢失。您希望我尝试重新连接吗?”的消息。
而且pgAdmin重新连接总是需要多次尝试,并且已经展开的对象树被折叠了......所以,这有点烦人。
pgAdmin 似乎没有与该行为相关的任何参数。(似乎有一些方法可以更改某些连接超时,但它们与 pgAdmin 在服务器连接时间过长时的行为方式有关)。
可以做些什么来避免 pgAdmin 与数据库断开连接?
披露:这实际上是一个“伪问题”。它是另一个的衍生产品,最终与失去连接无关......鉴于我已经有了一个答案,我(不是很谦虚地)认为值得“问”,以防万一回答对某人有帮助。
该表reports按天分区表,例如reports_20170414,reports_20170415
约束 SQL 定义如下
CHECK (
rpt_datetime >= '2017-04-14 00:00:00+00'::timestamp with time zone
AND
rpt_datetime < '2017-04-15 00:00:00+00'::timestamp with time zone
)
Run Code Online (Sandbox Code Playgroud)
让我们考虑两种类型的查询
SELECT SUM(rpt_unique_clicks)
FROM reports WHERE rpt_datetime >= '2017-04-14 00:00:00';
Run Code Online (Sandbox Code Playgroud)
以上查询在亚秒内运行,一切正常。
SELECT SUM(rpt_unique_clicks)
FROM reports WHERE rpt_datetime >=
date_trunc('day', current_timestamp);
Run Code Online (Sandbox Code Playgroud)
相反,上面的查询运行至少 15 秒。
SELECT date_trunc('day', CURRENT_TIMESTAMP), '2017-04-14 00:00:00';
Run Code Online (Sandbox Code Playgroud)
返回
2017-04-14 00:00:00 +00:00 | 2017-04-14 00:00:00
Run Code Online (Sandbox Code Playgroud)
当我检查为什么后者运行时间长(使用解释分析)时,我完成了它访问并扫描每个表(~500)的结果,但前者仅访问,reports_20170414因此约束检查存在问题。
我想查询今天,而不是像后一个查询那样使用准备好的语句。为什么date_trunc('day', CURRENT_TIMESTAMP)不等于 2017-04-14 00:00:00?
postgresql constraint partitioning timestamp check-constraints
我想将一些日志提取到报告中,以便获取夜间运行的 SQL_Agent_Jobs 状态。如果作业失败,那么我想在表中接收错误日志。我试图通过以下查询获取该信息:
DECLARE @job_id UNIQUEIDENTIFIER
SELECT
@job_id = job_id FROM msdb.dbo.sysjobs
WHERE
[name] like '%JOB_1%'
OR [name] like '%JOB_2%'
OR [name] like '%JOB_3%'
OR [name] like '%JOB_4%'
OR [name] like '%JOB_5%'
;WITH Error_Output (job_id, error_log) AS
(
SELECT
JS.job_id,
CASE
WHEN JSL.[log] IS NULL THEN JH.[Message]
ELSE JSL.[log]
END AS LogOutput
FROM
msdb.dbo.sysjobsteps JS
INNER JOIN msdb.dbo.sysjobhistory JH
ON JS.job_id = JH.job_id AND JS.step_id = JH.step_id
LEFT OUTER JOIN msdb.dbo.sysjobstepslogs JSL
ON JS.step_uid = JSL.step_uid
WHERE
INSTANCE_ID >
(SELECT …Run Code Online (Sandbox Code Playgroud) 正如你在这里看到的,在OrderInfo和 中OrderNumber,我有一个关系集。但我不确定是什么样的。我希望建立一个关系,所以如果我删除了OrderNumber,它会级联删除相应的记录中OrderInfo,但它不会让我。它给了我这个讨厌的'
不能在标识列上级联删除
错误,所以在删除级联删除后,它让我适当地保存它。我不确定关键的关键是什么,但我知道无限的关键是一对多?
在我的办公室,有人更改了用户对生产数据库的权限。所以在那之后我决定写一个 ddl 类型的触发器来审计权限更改。我已经用谷歌搜索了这个,但我找不到合适的解决方案。那么你们可以给我推荐几个链接或任何示例代码吗?
我想捕获谁更改了权限以及何时更改了权限。
提前致谢。
ALTER TABLE studentrecord CHANGE COLUMN Full name fullname VARCHAR(255) NOT NULL;
Run Code Online (Sandbox Code Playgroud)
我只想将“全名”更改为“全名”
我有这个 Postgres 9.6 表定义:
CREATE TABLE research (
id int,
data jsonb
);
Run Code Online (Sandbox Code Playgroud)
并在其中包含以下示例数据
id |data
---|--------------------------------------------------------
1 |{"name": "Sim Ltd", "sector": "business", "personnel": {"headcount": {"total": 100, "male": 50, "female": 50}}}
2 |{"name": "EcoSmart", "sector": "business", "personnel": {"headcount": {"total": 500, "male": 460, "female": 40}}}
3 |{"name": "HIDN", "sector": "government", "personnel": {"headcount": {"total": 431, "male": 121, "female": 310}}}
4 |{"name": "RevDev", "sector": "government", "personnel": {"headcount": {"total": 15, "male": 10, "female": 5}}}
5 |{"name": "NEFPAN", "sector": "non-profit", "personnel": {"headcount": {"total": 5, "male": …Run Code Online (Sandbox Code Playgroud) insert从表中的每个条目生成语句的最简单方法是什么?对于 3 行的表,我需要生成 3 个插入语句。
对于具有n行的表,我需要写入文件n insert语句。
例如,对于 row (foo, bar, baz) 我需要将语句写入该文件:
insert into desired_table values (foo, bar, baz)
Run Code Online (Sandbox Code Playgroud) 我很难定义问题,也许你通过我的虚拟数据理解它。
我有这个数据:
PK, TaskPK
1, 1
2, 1
3, 2
4, 2
5, 5
6, 1
7, 1
8, 2
9, 2
10, 5
11, 5
Run Code Online (Sandbox Code Playgroud)
现在我必须数TaskPK一下,我提出这个查询
Select PK, TaskPK, Count(*)
From tbl
Group by TaskPK
Run Code Online (Sandbox Code Playgroud)
带来了这样的结果
TaskPK, Count(*)
1, 4
2, 4
5, 3
Run Code Online (Sandbox Code Playgroud)
但我想要稍微不同的结果
像这样
TaskPK, Count(*)
1, 2
2, 2
5, 1
1, 2
2, 2
5, 2
Run Code Online (Sandbox Code Playgroud)
上面的结果基于连续的数据出现,因为TaskPK从1开始(它分组在一起),然后它改变它2(它分组在一起),然后5(它分组在一起)taskPK。但是当TaskPK再次变为1时,那么它应该单独分组,不与之前出现的1联系起来,这个任务单独计数。
这可能吗?
我有大量的大型数据库(300+!),它们的大小从很小到绝对庞大(120 GB+)不等。我已经确定了一种生成脚本的方法,以决定需要删除哪些索引、外键、主键和默认约束,以便将一组已知的列转换int为bigint数据类型。
我们遇到的问题是在更大的数据库上,我们在这个查询上运行了 2-3 天,这在生产中是不可接受的。是否有一种方法可以比当前的 drop-change-rebuild 过程更快地进行这些转换?
postgresql ×5
sql-server ×4
mysql ×3
constraint ×2
cascade ×1
client ×1
connectivity ×1
foreign-key ×1
json ×1
log ×1
network ×1
oracle ×1
partitioning ×1
permissions ×1
pgadmin ×1
plsql ×1
t-sql ×1
timestamp ×1