使用 PostgreSQL 时,我应该在哪里(或如何)在 select 语句中定义模式?

发布于 2024-07-14 17:08:30 字数 1359 浏览 7 评论 0原文

我有一个基于 ASP.NET 3.5 和 PostgreSQL 8.3 构建的应用程序。 我的数据库有3个用户,一个数据所有者(xxx-owner)、一个数据编辑器(xxx-editor)和一个数据查看器(xxx-viewer)。 每个用户都有自己的模式,称为 xxx-schema、xxx-editor-schema 和 xxx-viewer-schema。 所有数据都存储在xxx-schema中。

这要求我在作为 xxx-editor 或 xxx-viewer 用户连接到数据库时指定架构,如以下代码片段所示。

NpgsqlCommand pgCommand = new NpgsqlCommand();
pgCommand.CommandText = @"SELECT 
                        bldg_id,
                        bldg_name,
                        bldg_no,
                        FROM " + this.schema + @".buildings
                        WHERE UPPER(bldg_id) LIKE UPPER(@id);";

pgCommand.Parameters.Add("@id", "%" + id + "%");
pgCommand.Connection = pgConnection;

如果我遵循此路线,我将在 Web.config 中指定架构。 但是,必须有更好的方法来指定应使用哪个模式。 如果可能的话,我希望能够完全删除字符串连接。

定义 SQL 语句中使用的架构的最佳方法是什么?


编辑

以下内容来自 PostgreSQL 用户手册 看起来很有希望。

SearchPath - 将搜索路径更改为指定的公共架构。

从我有限的测试来看,它在我的情况下工作得很好。 然而,这是仅限 PostgreSQL 的解决方案。 是否有一个更加与数据库无关的解决方案,大多数数据库都提供这样的功能吗?


编辑2

我已在下面标记了答案,这导致我在数据库级别更改架构查找顺序。 通过以下更改,我不需要在 SQL 语句中添加代码。

ALTER USER xxx-viewer SET search_path TO '$user', xxx, public, sde

I have an application built upon ASP.NET 3.5 and PostgreSQL 8.3. My database has 3 users, a data owner (xxx-owner), a data editor (xxx-editor), and a data viewer (xxx-viewer). Each user has their own schema called xxx-schema, xxx-editor-schema and xxx-viewer-schema. All the data is stored in xxx-schema.

This requires that I specify the schema when connecting to the database as either the xxx-editor or xxx-viewer users as shown in the following snippet.

NpgsqlCommand pgCommand = new NpgsqlCommand();
pgCommand.CommandText = @"SELECT 
                        bldg_id,
                        bldg_name,
                        bldg_no,
                        FROM " + this.schema + @".buildings
                        WHERE UPPER(bldg_id) LIKE UPPER(@id);";

pgCommand.Parameters.Add("@id", "%" + id + "%");
pgCommand.Connection = pgConnection;

If I were to follow this route I would specify the schema in the Web.config. However, there must be a better way to specify which schema should be used. I would like to be able to remove the string concatenation entirely if possible.

What is the best way to define the schema to be used in the SQL statement?


EDIT

The following from the PostgreSQL User Manual looks promising.

SearchPath - Changes search path to specified and public schemas.

From my limited testing it works alright in my situation. However, this is a PostgreSQL only solution. Is there perhaps a more database agnostic solution, do most databases provided such functionality?


EDIT 2

I've marked the answer below which lead me to changing the schema lookup order at the database level. With the following change I do not need to add code in my SQL statements.

ALTER USER xxx-viewer SET search_path TO '$user', xxx, public, sde

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

白首有我共你 2024-07-21 17:08:30

您可以使用以下方法在每个会话的基础上设置模式搜索路径:

SET search_path TO myschema

如果您想回退到公共模式,您可以使用:

SET search_path TO myschema, public

You can set the schema search path on a per-session basis using:

SET search_path TO myschema

If you want to fall back to the public schema, you could use:

SET search_path TO myschema, public
℉服软 2024-07-21 17:08:30

您还可以执行以下操作:

SET SCHEMA 'myschema';

该语句与 SET search_path TO myschema, public 相同,但更多

You also can do:

SET SCHEMA 'myschema';

This statement is the same that SET search_path TO myschema, public but more

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文