当前位置: 首页 > article >正文

达梦数据库授权给某个用户查询其他指定用户下所有表的权限

方法1:

新版本有一个数据库参数

 GRANT_SCHEMA,表示是否开启授予和回收模式权限功能。0:否;1:是

此参数为静态参数,默认是0,将改参数修改为1后,重启数据库生效。

将参数修改为1

SP_SET_PARA_VALUE(2,'GRANT_SCHEMA',1);

参数生效后,可直接执行SQL进行授权,例如将模式 B 下所有对象的查询权限授予用户 A

GRANT SELECT ON SCHEMA B TO A;

方法2:

可以通过创建一个存储过程来实现:

CREATE OR REPLACE PROCEDURE GRANT_ALL_SEL(GRANTOR IN VARCHAR2, GRANTEE IN VARCHAR2) AS
    SQLSTMT VARCHAR2(4000);
    CURSOR CUR FOR SELECT ID, NAME FROM SYSOBJECTS WHERE TYPE$ = 'SCHOBJ' AND SUBTYPE$ IN ('STAB', 'UTAB') AND (PID = -1 OR PID = 0) AND SCHID = (SELECT ID FROM SYSOBJECTS WHERE TYPE$ = 'SCH' AND NAME = GRANTOR);
    TYPE MYREC IS CUR%ROWTYPE;
    REC_V MYREC;
    TYPE R_PRIV IS RECORD (CUR_PRIV_NAME VARCHAR2(128), CUR_BE_GRANT CHAR(1), CUR_CAN_GRANT CHAR(1), CUR_IS_GRANT CHAR(1), ORG_PRIV_NAME VARCHAR2(128), ORG_CAN_GRANT CHAR(1)); 
    TYPE T_PRIV IS TABLE OF R_PRIV;
    t_p T_PRIV;
    OBJ_PRIV CURSOR;
BEGIN
    FOR REC_V IN CUR LOOP
        OPEN OBJ_PRIV FOR
            WITH CUR_PRIVS(PRIV_NAME, BE_GRANT, CAN_GRANT, ISGRANT) AS
            (
                SELECT 'SELECT', 'Y', 'N', 'Y' FROM DUAL 
            )
            SELECT CUR_PRIVS.*, SF_GET_SYS_PRIV(ORG_PRIV.PRIVID), ORG_PRIV.GRANTABLE
            FROM CUR_PRIVS
            LEFT JOIN (SELECT * FROM SYSGRANTS WHERE OBJID = REC_V.ID AND COLID = -1 AND URID = 50331751) ORG_PRIV 
            ON CUR_PRIVS.PRIV_NAME = SF_GET_SYS_PRIV(ORG_PRIV.PRIVID);

        FETCH OBJ_PRIV BULK COLLECT INTO t_p;
        CLOSE OBJ_PRIV;

        FOR I IN 1..t_p.COUNT LOOP
            SQLSTMT := NULL;
            IF (t_p(I).CUR_IS_GRANT = 'Y') THEN
                IF (t_p(I).CUR_CAN_GRANT = 'Y') THEN
                    SQLSTMT := 'GRANT ' || t_p(I).CUR_PRIV_NAME || ' ON "' || GRANTOR || '"."' || REC_V.NAME || '" TO "' || GRANTEE || '" WITH GRANT OPTION';
                ELSE
                    IF (t_p(I).ORG_PRIV_NAME IS NULL) THEN
                        SQLSTMT := 'GRANT ' || t_p(I).CUR_PRIV_NAME || ' ON "' || GRANTOR || '"."' || REC_V.NAME || '" TO "' || GRANTEE || '"';
                    ELSE
                        IF (t_p(I).ORG_CAN_GRANT = 'Y') THEN
                            SQLSTMT := 'REVOKE GRANT OPTION FOR ' || t_p(I).CUR_PRIV_NAME || ' ON "' || GRANTOR || '"."' || REC_V.NAME || '" FROM "' || GRANTEE || '" CASCADE';
                        END IF;
                    END IF;
                END IF;
            ELSE
                IF (t_p(I).CUR_BE_GRANT = 'Y' AND t_p(I).ORG_PRIV_NAME IS NOT NULL) THEN
                    SQLSTMT := 'REVOKE ' || t_p(I).CUR_PRIV_NAME || ' ON "' || GRANTOR || '"."' || REC_V.NAME || '" FROM "' || GRANTEE || '" CASCADE';
                ELSE
                    IF (t_p(I).CUR_CAN_GRANT = 'Y' AND t_p(I).ORG_CAN_GRANT = 'Y') THEN
                        SQLSTMT := 'REVOKE GRANT OPTION FOR ' || t_p(I).CUR_PRIV_NAME || ' ON "' || GRANTOR || '"."' || REC_V.NAME || '" FROM "' || GRANTEE || '" CASCADE';
                    END IF;
                END IF;
            END IF;

            IF (SQLSTMT IS NOT NULL) THEN
                EXECUTE IMMEDIATE SQLSTMT;
            END IF;
        END LOOP;
    END LOOP;

    COMMIT;
END GRANT_ALL_SEL;

然后调用此存储过程即可,例如将模式 B 下所有对象的查询权限授予用户 A

CALL GRANT_ALL_SEL('B','A');


http://www.kler.cn/a/564818.html

相关文章:

  • es部署报错找不到tools.jar
  • 探索未来金融世界的钥匙——代币开发
  • iconfont和TTF
  • 最好Wordpree+Apache+PHP安装教程
  • 数据结构:反射 和 枚举
  • 安装Git(小白也会装)
  • 优选算法的智慧之光:滑动窗口专题(一)
  • 百度 API 教程 006:使用BMapGL.Marker3D绘制带高度的点纹理贴图
  • 《Linux Shell 编程基础精要:语法规则、变量解析与注释技巧》
  • 2024年第十五届蓝桥杯大赛软件赛省赛Python大学A组真题解析
  • 神经网络中的Adadelta
  • 一文彻底搞懂机器学习 - 逻辑回归(Logistic Regression)
  • apache-tomcat-6.0.10版本工具资源分享
  • 【一起学Rust | Tauri2.0框架】单实例应用程序的深入解析:零漏洞实现与优化实战
  • 从“记住我”到 Web 认证:Cookie、JWT 和 Session 的故事
  • Spring Boot智能物流管理系统开发与部署指南
  • opencv:距离变换 cv2.distanceTransform
  • Linux(centOS) 命令提示符格式修改(PS1)
  • Android中的Context是什么以及它有哪些类型
  • Spring Boot 2.7.x 至 2.7.18 及更旧的版本,漏洞说明