我正在尝试授予管理员,即" 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'
显然,我错过了一些东西。
欢迎提出任何建议。
答案 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的分支。