在MonetDB上为用户授予权限

时间:2015-08-23 09:52:42

标签: r monetdb

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

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

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

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

然后我尝试GRANT" monetdb" user1的权限

GRANT   monetdb TO "user1";

我没有收到任何错误。

如果我以user1身份登录MonetDb并尝试一个简单的选择(在sys架构的预先存在的表上),我得到:

SELECT * FROM sys.departmentfunctionindex
SELECT: access denied for user1 to table 'sys.departmentfunctionindex'
显然,我错过了一些东西。

欢迎提出任何建议。

3 个答案:

答案 0 :(得分:2)

我想我现在就明白了。

以下工作,使用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

答案 1 :(得分:1)

以下是使用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中选择,但不能修改它。如果此用户需要自己的表,可以使用someuserschema或临时表(在用户注销时删除)。因此,这有效:

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);

答案 2 :(得分:1)

不,您不必明确授予对每个表的访问权限。您仍然可以将GRANT monetdb用于" user1"。请参阅我之前的答案,目前,您只需要在用户创建的架构下创建表。我只是在"默认" MonetDB的分支。