RavenDB Sql 复制和 Postgres uuid
RavenDB Sql Replication and Postgres uuid
我已经使用 Postgres/Npgsql 设置了 Sql 复制。
我们在 Ravendb 中使用 Guids 作为 id。
只要我在 Postgres 中的 id 列是 varchar
类型,一切都工作正常,但如果我将它设置为 uuid
,这应该是匹配 Guid
的正确类型,它就会失败。
除 id 之外的其他列也失败。
Postgres 日志给我:
operator does not exist: uuid = text at character 34
HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts.
Postgres 架构如下所示:
CREATE TABLE public.materiels
(
id uuid NOT NULL,
type character varying(50),
nummer integer,
...
CONSTRAINT materiels_pkey PRIMARY KEY (id)
)
将第一行替换为
id character varying(50) NOT NULL
会成功的。
我的复制设置如下所示:
如果我将复制设置为使用 MSSql,它可以使用 MSSql 的 uniqueidentifier
数据类型。
如果您想将 UUID
与 TEXT
进行比较,则需要为此创建运算符。解决您的错误的方法如下所示:
CREATE FUNCTION uuid_equal_text(uuid, text)
RETURNS boolean
LANGUAGE SQL IMMUTABLE
AS
$body$
SELECT = ::uuid
$body$;
CREATE OPERATOR =(
PROCEDURE = uuid_equal_text,
LEFTARG = uuid,
RIGHTARG = text);
编辑:这个问题的作者自己提出的替代解决方案:
CREATE CAST (text AS uuid)
WITH INOUT
AS IMPLICIT;
我已经使用 Postgres/Npgsql 设置了 Sql 复制。
我们在 Ravendb 中使用 Guids 作为 id。
只要我在 Postgres 中的 id 列是 varchar
类型,一切都工作正常,但如果我将它设置为 uuid
,这应该是匹配 Guid
的正确类型,它就会失败。
除 id 之外的其他列也失败。
Postgres 日志给我:
operator does not exist: uuid = text at character 34 HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts.
Postgres 架构如下所示:
CREATE TABLE public.materiels
(
id uuid NOT NULL,
type character varying(50),
nummer integer,
...
CONSTRAINT materiels_pkey PRIMARY KEY (id)
)
将第一行替换为
id character varying(50) NOT NULL
会成功的。
我的复制设置如下所示:
uniqueidentifier
数据类型。
如果您想将 UUID
与 TEXT
进行比较,则需要为此创建运算符。解决您的错误的方法如下所示:
CREATE FUNCTION uuid_equal_text(uuid, text)
RETURNS boolean
LANGUAGE SQL IMMUTABLE
AS
$body$
SELECT = ::uuid
$body$;
CREATE OPERATOR =(
PROCEDURE = uuid_equal_text,
LEFTARG = uuid,
RIGHTARG = text);
编辑:这个问题的作者自己提出的替代解决方案:
CREATE CAST (text AS uuid)
WITH INOUT
AS IMPLICIT;