假设我有多个包含列的表foobar
。我希望使所有这些列都引用foobar.id
为FOREIGN KEY
。问题是我知道从我导入数据的一方那里存在此架构违规行为。但是,我宁愿不迭代地找到它们。
我如何才能找到所有违规行为,以便为第三方准备数据完整性问题报告?
假设我有多个包含列的表foobar
。我希望使所有这些列都引用foobar.id
为FOREIGN KEY
。问题是我知道从我导入数据的一方那里存在此架构违规行为。但是,我宁愿不迭代地找到它们。
我如何才能找到所有违规行为,以便为第三方准备数据完整性问题报告?
当我在 Rust 中运行这段代码时
statement.read::<i64, _>("creation_utc").unwrap(),
我明白了,
错误 { code: None, message: Some("索引超出范围 (
creation_utc
)") }
但我已经多次验证该列是否在表中。是什么问题导致此错误以及如何解决此错误?
我对PostgreSQL的扩展系统是如何实现的很感兴趣。postgres服务器如何调用与服务器分开构建的用户定义的C。
以前,当我通过 Terraform 使用 Bitnami Helm 图表来部署 PostgreSQL 时,我会创建一个数据库。现在我不再创建数据库了。我在用着
但我在 Kubernetes 日志中收到此错误,
psql:错误:致命:数据库“foo”不存在
为什么我不再有初始数据库?
当我从 ArtifactHUB 运行命令来安装mysql-innodbcluster
helm install my-mysql-innodbcluster mysql-operator/mysql-innodbcluster --version 2.0.4
我收到以下错误,
错误:安装失败:(
mysql-innodbcluster/templates/deployment_cluster.yaml:18:8
)处的执行错误:tls.routerCertAndPKsecretName:在命名空间“默认”中找不到秘密“my-mysql-innodbcluster-router-tls”
我该如何解决?
我正在按照ArtifactHubmysql-operator/mysql-operator
上的说明进行操作。
helm install my-mysql-operator mysql-operator/mysql-operator --version 2.0.4
但我得到了错误
错误:安装失败:(mysql-operator/templates/service_account_operator.yaml:3:5)处的执行错误:请提供带有
-n
/的命名空间--namespace
。操作员不能安装在“默认”命名空间中
我能做些什么来解决这个错误?
我正在寻找用 C 编写扩展。我想更好地理解这个论点是什么以及它们如何在不同的调用中发生变化。有什么可以转储这个参数或调试fcinfo
参数的方法吗?
在这个问题中,我了解到它实际上是一个指向结构的指针FunctionCallInfoBaseData
,但是有没有一种简单的方法可以在函数调用时转储它?
PostgreSQL 用“V1”接口记录他们所有的 C 函数,但他们实际上并没有显示他们得到了什么,
PG_FUNCTION_INFO_V1(add_one);
Datum
add_one(PG_FUNCTION_ARGS)
{
int32 arg = PG_GETARG_INT32(0);
PG_RETURN_INT32(arg + 1);
}
在上面PG_FUNCTION_ARGS
声明要接受的函数是什么?许多 V1 函数似乎fcinfo
神奇地出现在定义中,我猜它是在这里引入的,但它是什么,这个宏还引入了其他任何东西吗?
研究这个问题,我看到 call 有一个SetFunctionReturnMode
值SFRM_Materialize_Preferred
。这是什么?这可以用来编写性能更高的函数吗?
PostgreSQL 记录了它的Set Returning Functions 和这样的 C 扩展,
C 语言函数有两个用于返回集合(多行)的选项。
- 在一种称为
ValuePerCall
mode的方法中,重复调用一个返回集合的函数(每次传递相同的参数),并且在每次调用时返回一个新行,直到没有更多行要返回,并通过返回 NULL 来发出信号。因此,set-returning 函数 (SRF) 必须在调用之间保存足够的状态以记住它在做什么并在每次调用时返回正确的下一项。- 在另一个名为
Materialize
mode的方法中, SRF 填充并返回一个包含其整个结果的 tuplestore 对象;那么整个结果只发生一次调用,不需要调用间状态。
如果您正在优化执行速度,哪个更快ValuePerCall
或Materialize
模式?显然,物化模式将占用更多内存,但如果您的目标是返回一整套,它似乎应该更快,但我没有看到任何地方都有记录。
这些似乎在代码中记录为Set Returning Function Mode SFRM_ValuePerCall
和SFRM_Materialize
.
当您在 C 中扩展 PostgreSQL 时,如何自省/调试/转储变量?除了将自定义结果集返回给客户端之外,还有其他方法吗?printf
我可以在服务器或客户端的日志中收到类似的东西?
SQL Server 有一个类型标志,称为is_nullable
您可以在sys.types
. 目前,(SQL Server 2019)它只设置为FALSE
两种类型,sys.timestamp
和sys.sysname
. 对sys.timestamp
这种类型似乎接受null
。在sys.sysname
它没有。这种行为有什么解释吗?
你可以看到这些类型
SELECT * FROM sys.types WHERE is_nullable = 0;
SELECT TYPEPROPERTY('timestamp', 'AllowsNull'); -- returns 0
你可以像这样使用它,
CREATE TABLE foo ( a sys.timestamp );
INSERT INTO foo (a) VALUES ( null );
请注意,如果您使用,这将不起作用sys.sysname
Msg 515 Level 16 State 2 Line 1 Cannot insert the value NULL into column 'a', table 'dbo.foo'; column does not allow nulls. INSERT fails. Msg 3621 Level 0 State 0 Line 1 The statement has been terminated.
如果您创建用户定义的数据类型,它也将不起作用,NOT NULL
CREATE TYPE bar FROM int NOT NULL;
这只是对用户的提示吗?
MySQL 8 有一个非常复杂的“密码验证组件”(它取代了validate_password
插件)。它有很多选择,
validate_password.number_count
validate_password.mixed_case_count
validate_password.special_char_count
validate_password.dictionary_file
validate_password.length
鉴于这些都可以由用户设置,是否有机制保证生成满足这一点的随机密码?是编写一个更改密码以在设置验证组件时暂停验证组件的 UI 的唯一方法吗?
假设我们有一个简单的表,
CREATE TABLE foo ( a int PRIMARY KEY, b int );
我想在里面写一个复杂的查询并参考那个查询
INSERT INTO foo
SELECT 5 AS z
ON CONFLICT (a)
DO UPDATE SET b = z;
但是,当我执行时,我收到这样的错误,
ERROR: column "z" does not exist
LINE 4: DO UPDATE SET b = z;
^
提示:表“ SELECT ”中有一个名为“z”的列,但不能从这部分查询中引用它。
有没有办法让这样的结构工作?
为什么临时表不能引用 PostgreSQL 中的非临时表?当我运行以下
CREATE TABLE foo ( a int PRIMARY KEY );
CREATE TEMP TABLE bar ( a int REFERENCES foo );
我明白了,
错误:临时表的约束可能只引用临时表
我认为这曾经可以工作,所以我回到 PostgreSQL 8.4,即使这样我也看到它曾经出错,
错误:无法从临时表约束中引用永久表
这是为什么?为什么临时表不能引用非临时表。
在 PostgreSQL 中,我可以创建一个包含一些测试数据的表,然后在事务中将其迁移到不同类型的新列,从而导致一个表重写COMMIT
,
CREATE TABLE foo ( a int );
INSERT INTO foo VALUES (1),(2),(3);
其次是,
BEGIN;
ALTER TABLE foo ADD COLUMN b varchar;
UPDATE foo SET b = CAST(a AS varchar);
ALTER TABLE foo DROP COLUMN a;
COMMIT;
但是,在 Microsoft 的 SQL Server 中,同样的事情似乎会产生错误。比较这个工作db fiddle,其中ADD
(column) 命令在事务之外,
-- txn1
BEGIN TRANSACTION;
ALTER TABLE foo ADD b varchar;
COMMIT;
-- txn2
BEGIN TRANSACTION;
UPDATE foo SET b = CAST( a AS varchar );
ALTER TABLE foo DROP COLUMN a;
COMMIT;
到这个不起作用的数据库小提琴,
-- txn1
BEGIN TRANSACTION;
ALTER TABLE foo ADD b varchar;
UPDATE foo SET b = CAST( a AS varchar );
ALTER TABLE foo DROP COLUMN a;
COMMIT;
而是错误
Msg 207 Level 16 State 1 Line 2
Invalid column name 'b'.
关于 DDL,是否有让这个事务可见的行为,就像 PostgreSQL 一样?
我已连接到数据库foo
,并且我想解析该数据库的基础目录在哪里,我有什么选择?显然,我可以从datadir
, 和数据库名称进行推理,但存在问题:它需要我实现自己的encode
函数来将标识符映射到文件名。. 这是编码依赖的。
这个编码过程是强制性的,数据库foo._234-asdf
映射到数据目录/var/lib/mysql/foo@002e_234@002dasdf
。
是否有支持查询特定数据库或连接数据库的数据目录的方法?
MySQL的数据库大小可以用
SELECT table_schema AS db_name, SUM(data_length + index_length) AS size
FROM INFORMATION_SCHEMA.TABLES
WHERE table_schema != 'INFORMATION_SCHEMA'
GROUP BY db_name
但是您也可以通过查看数据目录的磁盘使用情况来计算数据库大小。这两个数字应该偏离吗?有没有理由使用其中一种方法?通过扩展,INFORMATION_SCHEMA.TABLES
'data_length
和是如何index_length
计算的?
PostgreSQL 有一个特殊的功能,称为COMMENT
将元数据附加到标识符或任何类型(模式、表、列、函数、类型、域等)。看起来像这样,
COMMENT ON TABLE mytable IS 'This is my table.';
评论有最大尺寸吗?
似乎在 MySQL 和 MariaDB 中,当我尝试使用 LineString 构造函数时,我得到了以下信息。在PostGIS 中,我可以用ST_MakeLine(pt1,pt2)
> SELECT ST_MakeLine(Point(0,0), Point(0,1));
ERROR 1305 (42000): FUNCTION ST_MakeLine does not exist
> SELECT ST_LineString(Point(0,0), Point(0,1));
ERROR 1305 (42000): FUNCTION ST_LineString does not exist
构造 a 的唯一方法是LINESTRING
使用ST_GeomFromText
orST_LineFromText
还是 orST_LineStringFromText
?