Changeset: 15a2e5df6dc0 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=15a2e5df6dc0 Modified Files: dump.sql dump_output.sql sql/scripts/52_describe.sql Branch: monetdbe-proxy Log Message:
dump grants. diffs (157 lines): diff --git a/dump.sql b/dump.sql --- a/dump.sql +++ b/dump.sql @@ -477,6 +477,77 @@ RETURN SELECT 'COMMENT ON ' || c.tpe || ' ' || c.fqn || ' IS ' || SQ(c.rem) || ';' FROM describe_comments() c; END; +CREATE FUNCTION describe_privileges() RETURNS TABLE(o_id INT, o_nme STRING, o_tpe STRING, p_nme STRING, a_nme STRING, g_nme STRING, grantable BOOLEAN) BEGIN +RETURN SELECT + CASE + WHEN o.id IS NULL THEN + 0 + ELSE + o.id + END, + CASE + WHEN o.tpe IS NULL AND pc.privilege_code_name = 'SELECT' THEN --GLOBAL privileges: SELECT maps to COPY FROM + 'COPY FROM' + WHEN o.tpe IS NULL AND pc.privilege_code_name = 'UPDATE' THEN --GLOBAL privileges: UPDATE maps to COPY INTO + 'COPY INTO' + ELSE + o.nme + END, + CASE + WHEN o.tpe IS NOT NULL THEN + o.tpe + ELSE + 'GLOBAL' + END, + pc.privilege_code_name, + a.name, + g.name, + p.grantable +FROM + privileges p LEFT JOIN + ( + SELECT t.id, s.name || '.' || t.name , 'TABLE' + from sys.schemas s, sys.tables t where s.id = t.schema_id + UNION ALL + SELECT c.id, s.name || '.' || t.name || '.' || c.name, 'COLUMN' + FROM sys.schemas s, sys.tables t, sys.columns c where s.id = t.schema_id AND t.id = c.table_id + UNION ALL + SELECT f.id, f.nme, f.tpe + FROM fully_qualified_functions() f + ) o(id, nme, tpe) ON o.id = p.obj_id, + sys.privilege_codes pc, + auths a, auths g +WHERE + p.privileges = pc.privilege_code_id AND + p.auth_id = a.id AND + p.grantor = g.id; +END; + +CREATE FUNCTION dump_privileges() RETURNS TABLE (stmt STRING) BEGIN +RETURN + SELECT + 'INSERT INTO sys.privileges VALUES (' || + CASE + WHEN dp.o_tpe = 'GLOBAL' THEN + '0,' + WHEN dp.o_tpe = 'TABLE' THEN + '(SELECT t.id FROM sys.schemas s, tables t WHERE s.id = t.schema_id' || + ' AND s.name || ''.'' || t.name =' || SQ(dp.o_nme) || '),' + WHEN dp.o_tpe = 'COLUMN' THEN + '(SELECT c.id FROM sys.schemas s, tables t, columns c WHERE s.id = t.schema_id AND t.id = c.table_id' || + ' AND s.name || ''.'' || t.name || ''.'' || c.name =' || SQ(dp.o_nme) || '),' + ELSE -- FUNCTION-LIKE + '(SELECT fqn.id FROM fully_qualified_functions() fqn WHERE' || + ' fqn.nme = ' || SQ(dp.o_nme) || ' AND fqn.tpe = ' || SQ(dp.o_tpe) || '),' + END || + '(SELECT id FROM auths a WHERE a.name = ' || SQ(dp.a_nme) || '),' || + '(SELECT pc.privilege_code_id FROM privilege_codes pc WHERE pc.privilege_code_name = ' || SQ(p_nme) || '),' + '(SELECT id FROM auths g WHERE g.name = ' || SQ(dp.g_nme) || '),' || + dp.grantable || + ');' + FROM describe_privileges() dp; +END; + --The dump statement should normally have an auto-incremented column representing the creation order. --But in cases of db objects that can be interdependent, i.e. functions and table-likes, we need access to the underlying sequence of the AUTO_INCREMENT property. --Because we need to explicitly overwrite the creation order column "o" in those cases. After inserting the dump statements for functions and table-likes, @@ -555,11 +626,14 @@ BEGIN INSERT INTO dump_statements(s) SELECT * FROM dump_foreign_keys(); INSERT INTO dump_statements(s) SELECT * FROM dump_partition_tables(); INSERT INTO dump_statements(s) SELECT * from dump_triggers(); - INSERT INTO dump_statements(s) SELECT * FROM dump_comments(); - --TODO TABLE level grants - --TODO COLUMN level grants + --We are dumping ALL privileges so we need to erase existing privileges on the receiving side; + INSERT INTO dump_statements(s) VALUES ('TRUNCATE sys.privileges;'); + INSERT INTO dump_statements(s) SELECT * FROM dump_privileges(); + + --move describe functions 52_describe.sql + --merge dump_type with describe_type function in 52_describe.sql --TODO User Defined Types? sys.types --TODO loaders ,procedures, window and filter functions. --TODO dumping table data diff --git a/dump_output.sql b/dump_output.sql --- a/dump_output.sql +++ b/dump_output.sql @@ -46,6 +46,10 @@ CREATE TABLE "sys"."second_decade" ("sta CREATE TABLE "sys"."third_decade" ("stamp" TIMESTAMP , "val" INTEGER); CREATE TABLE "sys"."p1" ("i" INTEGER); create or replace window "sys"."stddev" (val bigint) returns double external name "sql"."stdevp"; +CREATE TABLE "sys"."foo" ("i" INTEGER, "j" INTEGER); +create function "sys"."f1" () returns int begin return 10; end; +create procedure "sys"."f1" (i int) begin declare x int; end; +create procedure "sys"."f1" () begin declare x int; end; ALTER TABLE "sys"."yoyo" ALTER COLUMN "tsz" SET DEFAULT 'BLABOLO'; ALTER TABLE "sys"."bolo" ADD CONSTRAINT "cpk" PRIMARY KEY ("s", "v"); ALTER TABLE "sys"."rolo" ADD CONSTRAINT "rolo_v_pkey" PRIMARY KEY ("v"); @@ -69,4 +73,11 @@ COMMENT ON COLUMN "sfoo"."tfoo1"."i" IS COMMENT ON INDEX "sys"."ind3" IS 'This is a comment on an index.' ; COMMENT ON SEQUENCE "sys"."seq1" IS 'This is a comment on a sequence.' ; COMMENT ON WINDOW "sys"."stddev" IS 'This is a comment on a window function.' ; +TRUNCATE sys.privileges; +INSERT INTO sys.privileges VALUES ((SELECT t.id FROM sys.schemas s, tables t WHERE s.id = t.schema_id AND s.name || '.' || t.name = 'sys.foo' ),(SELECT id FROM auths a WHERE a.name = 'voc' ),(SELECT pc.privilege_code_id FROM privilege_codes pc WHERE pc.privilege_code_name = 'SELECT' ),(SELECT id FROM auths g WHERE g.name = 'monetdb' ),false); +INSERT INTO sys.privileges VALUES ((SELECT c.id FROM sys.schemas s, tables t, columns c WHERE s.id = t.schema_id AND t.id = c.table_id AND s.name || '.' || t.name || '.' || c.name = 'sys.foo.i' ),(SELECT id FROM auths a WHERE a.name = 'voc' ),(SELECT pc.privilege_code_id FROM privilege_codes pc WHERE pc.privilege_code_name = 'UPDATE' ),(SELECT id FROM auths g WHERE g.name = 'monetdb' ),false); +INSERT INTO sys.privileges VALUES ((SELECT fqn.id FROM fully_qualified_functions() fqn WHERE fqn.nme = 'sys.f1(INTEGER)' AND fqn.tpe = 'FUNCTION' ),(SELECT id FROM auths a WHERE a.name = 'voc' ),(SELECT pc.privilege_code_id FROM privilege_codes pc WHERE pc.privilege_code_name = 'EXECUTE' ),(SELECT id FROM auths g WHERE g.name = 'monetdb' ),false); +INSERT INTO sys.privileges VALUES ((SELECT fqn.id FROM fully_qualified_functions() fqn WHERE fqn.nme = 'sys.f1(INTEGER)' AND fqn.tpe = 'PROCEDURE' ),(SELECT id FROM auths a WHERE a.name = 'voc' ),(SELECT pc.privilege_code_id FROM privilege_codes pc WHERE pc.privilege_code_name = 'EXECUTE' ),(SELECT id FROM auths g WHERE g.name = 'monetdb' ),false); +INSERT INTO sys.privileges VALUES ((SELECT fqn.id FROM fully_qualified_functions() fqn WHERE fqn.nme = 'sys.f1()' AND fqn.tpe = 'PROCEDURE' ),(SELECT id FROM auths a WHERE a.name = 'voc' ),(SELECT pc.privilege_code_id FROM privilege_codes pc WHERE pc.privilege_code_name = 'EXECUTE' ),(SELECT id FROM auths g WHERE g.name = 'monetdb' ),true); +INSERT INTO sys.privileges VALUES (0,(SELECT id FROM auths a WHERE a.name = 'voc' ),(SELECT pc.privilege_code_id FROM privilege_codes pc WHERE pc.privilege_code_name = 'UPDATE' ),(SELECT id FROM auths g WHERE g.name = 'monetdb' ),false); COMMIT; diff --git a/sql/scripts/52_describe.sql b/sql/scripts/52_describe.sql --- a/sql/scripts/52_describe.sql +++ b/sql/scripts/52_describe.sql @@ -174,3 +174,28 @@ BEGIN LEFT OUTER JOIN sys.comments c ON f.id = c.id WHERE f.name=functionName AND s.name = schemaName; END; + +CREATE FUNCTION fully_qualified_functions() RETURNS TABLE(id INT, tpe STRING, nme STRING) BEGIN +RETURN + WITH fqn(id, tpe, sig, num) AS + ( + SELECT + f.id, + ft.function_type_keyword, + CASE WHEN a.type IS NULL THEN + s.name || '.' || f.name || '()' + ELSE + s.name || '.' || f.name || '(' || group_concat(describe_type(a.type, a.type_digits, a.type_scale), ',') OVER (PARTITION BY f.id ORDER BY a.number) || ')' + END, + a.number + FROM schemas s, sys.function_types ft, functions f LEFT JOIN args a ON f.id = a.func_id + WHERE s.id= f.schema_id AND f.type = ft.function_type_id + ) + SELECT + fqn1.id, + fqn1.tpe, + fqn1.sig + FROM + fqn fqn1 JOIN (SELECT id, max(num) FROM fqn GROUP BY id) fqn2(id, num) + ON fqn1.id = fqn2.id AND (fqn1.num = fqn2.num OR fqn1.num IS NULL AND fqn2.num is NULL); +END; _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list