使用 PostgreSQL 时,我应该在哪里(或如何)在 select 语句中定义模式?
我有一个基于 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
您可以使用以下方法在每个会话的基础上设置模式搜索路径:
如果您想回退到公共模式,您可以使用:
You can set the schema search path on a per-session basis using:
If you want to fall back to the public schema, you could use:
您还可以执行以下操作:
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