向 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
我正在尝试授予管理员权限,即 "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