我有一个基于 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