向 MonetDB 上的用户授予权限

Grant privileges to users on MonetDB

我正在尝试授予管理员权限,即 "monetdb" 权限给用户,到目前为止没有任何成功(权限应该扩展到 sys 模式的所有 table)。 因为我有一个包含许多 tables 的模式,所以要向所有提及所有 tables 的用户提供明确的权利(例如 SELECT )会非常复杂:我需要找到一种有效的方法这样做。

我使用超级用户 monetdb 通过 SQLWorkbenchJ 登录到 MonetDB。 我还尝试使用 R 和 MonetDB.R 包直接发送查询(没有区别)。

我创建了一个与模式(例如 sys 模式)相关联的用户

CREATE USER "user1" WITH PASSWORD 'user1' NAME 'user one' SCHEMA "sys";

然后我尝试将 "monetdb" 权限授予 user1

GRANT   monetdb TO "user1";

而且我没有收到任何错误。

如果我以 user1 身份登录 MonetDb 并尝试一个简单的 select(在预先存在的 table 系统架构上)我得到:

SELECT * FROM sys.departmentfunctionindex
SELECT: access denied for user1 to table 'sys.departmentfunctionindex'

显然我遗漏了什么。

欢迎提出任何建议。

这是一个使用 MonetDB 向单独用户授予 SELECT 权限的工作示例:

作为管理员(例如 monetdb帐户)

CREATE SCHEMA "somedataschema";
CREATE TABLE "somedataschema"."somepersistenttable" (i INTEGER);
INSERT INTO "somedataschema"."somepersistenttable" VALUES (42);

CREATE USER "someuser" WITH PASSWORD 'someuserpass' NAME 'someusername' SCHEMA "sys";
GRANT SELECT ON "somedataschema"."somepersistenttable" TO "someuser";

CREATE SCHEMA "someuserschema" AUTHORIZATION "someuser";
ALTER USER "someuser" SET SCHEMA "someuserschema";

现在,someuser 可以从 somepersistenttable SELECT,但不能修改它。如果这个用户自己需要 table,可以使用 someuserschema 或临时的 table(当用户注销时删除)。因此,这有效:

SELECT * FROM "somedataschema"."somepersistenttable";

CREATE TABLE "someuserschema"."sometemptable" (i integer);
INSERT INTO "someuserschema"."sometemptable" VALUES (84);
SELECT * FROM "sometemptable";

CREATE TEMPORARY TABLE "sometemptable" (i INTEGER) ON COMMIT PRESERVE ROWS;
INSERT INTO "sometemptable" VALUES (42);
SELECT  * FROM "sometemptable";

这将产生一个 insufficient privileges 错误(更新、删除、更改等相同):

INSERT INTO "somedataschema"."somepersistenttable" VALUES (43);

请查看此 MonetDB 错误报告。授予权限适用于用户创建的模式,但错误修复似乎未涵盖默认的 "sys" 模式。

不,您不必明确授予对每个表的访问权限。您仍然可以使用 GRANT monetdb 到 "user1"。请参阅我之前的回答,目前,您只需要在用户创建的模式下创建您的表。我刚刚在 MonetDB 的 "default" 分支中尝试了它。

我想我现在明白了。

以下工作,使用 SQLWorkbenchJ 我以 monetdb(超级用户)身份登录到 MonetDB。

我运行:

CREATE USER "user20" WITH PASSWORD 'user20' NAME 'user 20'   SCHEMA "sys";

CREATE SCHEMA "mschema" AUTHORIZATION "monetdb";
CREATE table "mschema"."mtestTable"(v1 int, v2 int);
INSERT INTO "mschema"."mtestTable" VALUES (4, 4);
GRANT monetdb to "user20"; -- this gives implicit superuser powers to user20 (but not for the "sys" schema)

现在我以用户 "user20".

注销并再次登录

我运行:

SET SCHEMA mschema; -- I was missing this before but it is essential
SET ROLE monetdb;

此时user20已经获得超级用户monetdb的所有授权,例如:

SELECT * FROM "mschema"."mtestTable"; -- can use select
DROP TABLE "mschema"."mtestTable"; -- can use drop etc.

感谢@Hannes、@Ying 和@Dimitar