SQL权限控制是数据库安全的重要组成部分,通过`GRANT`(授予权限)和`REVOKE`(收回权限)语句实现对用户操作权限的管理

张开发
2026/6/9 6:51:27 15 分钟阅读
SQL权限控制是数据库安全的重要组成部分,通过`GRANT`(授予权限)和`REVOKE`(收回权限)语句实现对用户操作权限的管理
1. SQL权限控制语句SQL权限控制是数据库安全的重要组成部分通过GRANT授予权限和REVOKE收回权限语句实现对用户操作权限的管理。1.1 授予权限GRANT语法格式GRANT权限[,权限]...[ON对象类型对象名]TO用户[,用户]...[WITHGRANTOPTION];WITH GRANT OPTION表示获得权限的用户可以将权限再授予其他用户权限类型包括SELECT、INSERT、UPDATE、DELETE、CREATE等对象类型可以是TABLE、DATABASE等示例-- 授予User1对S表的INSERT权限并允许其转授GRANTINSERTONTABLESTOUser1WITHGRANTOPTION;-- 授予User1在SPJ数据库中创建表的权限GRANTCREATETABONDATABASESPJTOUser1;1.2 收回权限REVOKE语法格式REVOKE权限[,权限]...[ON对象类型对象名]FROM用户[,用户]...;示例-- 收回User1和User2对S、P、J表的所有操作权限REVOKEALLPRIVILEGESONTABLES,P,JFROMUser1,User2;-- 收回所有用户对S表的查询权限REVOKESELECTONTABLESFROMPUBLIC;-- 收回User1对S表中Sno字段的修改权限REVOKEUPDATE(Sno)ONTABLESFROMUser1;2. 嵌入式SQL嵌入式SQL是将SQL语句嵌入到高级语言如C、COBOL、PL/I等中使用的技术实现应用程序与数据库的交互。2.1 基本原理预编译处理预编译器识别嵌入的SQL语句将其转换为主语言可调用的函数核心问题区分主语言中的SQL语句解决主语言与SQL之间的通信问题标识方法所有SQL语句前加前缀EXEC SQL结束标志随主语言不同而变化不同主语言的引用格式PL/I和C语言EXEC SQL SQL语句;COBOL语言EXEC SQL SQL语句 END-EXEC2.2 通信机制嵌入式SQL与主语言之间的通信主要通过3种方式实现SQL通信区SQLCA向主语言传递SQL语句执行的状态信息主语言根据这些信息控制程序流程主变量主语言和SQL语句之间共享的变量用于传递数据游标用于处理SQL查询返回的多行结果集实现逐行数据处理二、试题及答案一、单项选择题每题2分共20分在SQL中用于授予用户权限的命令是 A. CREATE B. GRANT C. REVOKE D. ALTER答案B在SQL中用于撤销用户权限的命令是 A. GRANT B. DROP C. REVOKE D. DELETE答案C授予用户权限时允许用户将权限再授予其他用户的子句是 A. WITH ADMIN OPTION B. WITH GRANT OPTIONC. WITH TRANSFER OPTION D. WITH SHARE OPTION答案B收回所有用户对某个表的查询权限应该使用 A. REVOKE SELECT ON TABLE 表名 FROM ALL;B. REVOKE SELECT ON TABLE 表名 FROM PUBLIC;C. REVOKE ALL PRIVILEGES ON TABLE 表名 FROM ALL;D. REVOKE ALL PRIVILEGES ON TABLE 表名 FROM PUBLIC;答案B嵌入式SQL语句中用于区分主语言变量和数据库字段的符号是 A. 冒号 B. 分号 C. 逗号 D. 感叹号答案A嵌入式SQL中用于传递执行状态信息的是 A. 主变量 B. 游标 C. SQLCA D. 存储过程答案C在嵌入式SQL中处理多行查询结果需要使用 A. 主变量 B. 游标 C. SQLCA D. 触发器答案B嵌入式SQL的正确前缀是 A. EXEC SQL B. SQL EXEC C. BEGIN SQL D. SQL BEGIN答案A下列权限中不属于数据操作权限的是 A. SELECT B. INSERT C. CREATE TABLE D. UPDATE答案C最小权限原则是指 A. 用户应该拥有尽可能多的权限B. 用户只应该拥有完成其工作所需的最小权限C. 用户权限应该定期最小化D. 所有用户的权限应该保持一致答案B二、多项选择题每题3分共15分下列属于SQL权限类型的有 A. SELECT B. INSERT C. UPDATE D. DELETE E. CREATE答案ABCDE嵌入式SQL与主语言的通信方式包括 A. SQL通信区 B. 主变量 C. 游标 D. 存储过程 E. 触发器答案ABC关于REVOKE语句下列说法正确的有 A. 可以收回单个用户的权限B. 可以收回多个用户的权限C. 可以收回特定字段的权限D. 可以收回所有用户的权限E. 收回权限时会级联收回用户转授的权限答案ABCD嵌入式SQL的优点包括 A. 语法标准统一 B. 数据类型自动转换C. 错误处理机制完善 D. 跨数据库迁移成本低E. 可以利用主语言的流程控制能力答案ABCE数据库权限控制的目标包括 A. 保证数据的安全性 B. 防止未授权访问C. 保证数据的完整性 D. 提高系统性能E. 实现审计追踪答案ABCE三、判断题每题2分共10分用户一旦被授予权限就无法被收回。 答案×PUBLIC表示所有用户。 答案√嵌入式SQL中主变量在SQL语句中使用时需要加冒号前缀。 答案√SQLCA用于存储SQL语句的执行结果数据。 答案×SQLCA用于存储执行状态信息而非结果数据最小权限原则可以降低系统安全风险。 答案√四、简答题每题5分共15分简述GRANT和REVOKE语句的作用及基本语法。答GRANT语句用于向用户授予数据库对象的操作权限基本语法为GRANT权限列表ON对象类型对象名TO用户列表[WITHGRANTOPTION];REVOKE语句用于收回用户已有的权限基本语法为REVOKE权限列表ON对象类型对象名FROM用户列表;什么是嵌入式SQL它解决了什么问题答嵌入式SQL是将SQL语句嵌入到高级程序设计语言主语言中使用的技术允许主语言利用SQL的数据库操作能力同时SQL可以利用主语言的流程控制和复杂逻辑处理能力。它解决了两个核心问题打通了主语言与数据库之间的交互通道解决了面向集合的SQL语言与面向记录的主语言之间的阻抗失配问题简述嵌入式SQL中SQL通信区SQLCA的作用。答SQL通信区SQLCA是DBMS预定义的全局数据结构用于向主语言传递SQL语句的执行状态信息。DBMS每次执行完SQL语句后都会将执行状态写入SQLCA包括sqlcode执行结果状态码0表示成功100表示未找到数据负数表示错误sqlstate标准化的状态码跨数据库兼容错误信息描述等主语言通过读取SQLCA中的信息可以判断SQL执行是否成功并据此控制程序流程。五、编程题每题10分共20分按要求写出对应的SQL语句1授予用户user1对学生表student的查询和插入权限并允许其转授这些权限。2收回用户user2对课程表course的修改权限。3收回所有用户对成绩表score的删除权限。答-- (1)GRANTSELECT,INSERTONTABLEstudentTOuser1WITHGRANTOPTION;-- (2)REVOKEUPDATEONTABLEcourseFROMuser2;-- (3)REVOKEDELETEONTABLEscoreFROMPUBLIC;写出C语言中嵌入式SQL的示例代码实现根据学号查询学生姓名的功能学号由主变量givensno传入姓名存入主变量sname中。答#includestdio.h#includestdlib.hEXEC SQL BEGIN DECLARE SECTION;chargivensno[10];// 输入学号主变量charsname[50];// 输出姓名主变量charSQLSTATE[6];// 状态码EXEC SQL END DECLARE SECTION;intmain(){printf(请输入要查询的学号);scanf(%s,givensno);// 连接数据库此处省略连接代码// 执行查询EXEC SQL SELECT sname INTO:sname FROM student WHERE sno:givensno;if(SQLCODE0){printf(查询成功学生姓名%s\n,sname);}elseif(SQLCODE100){printf(未找到该学号的学生\n);}else{printf(查询出错错误码%d\n,SQLCODE);}return0;}六、综合应用题20分某企业数据库包含三个表员工表emp(eno, ename, age, salary, dno)eno为主键部门表dept(dno, dname, manager)dno为主键项目表proj(pno, pname, budget)pno为主键现有三个用户人事专员user1、部门经理user2、普通员工user3。请完成以下权限设计user1需要对员工表有查询、插入、修改权限对部门表有查询权限。user2需要对本部门dno10的员工表有查询和修改工资的权限对项目表有全部权限。user3只能查询自己的员工信息eno‘E001’和所有部门名称。收回user1对员工表的插入权限。请写出对应的SQL语句。答-- 1. 授予user1权限GRANTSELECT,INSERT,UPDATEONTABLEempTOuser1;GRANTSELECTONTABLEdeptTOuser1;-- 2. 授予user2权限-- 创建视图限制仅能访问dno10的员工CREATEVIEWemp_dept10ASSELECT*FROMempWHEREdno10;GRANTSELECT,UPDATE(salary)ONTABLEemp_dept10TOuser2;GRANTALLPRIVILEGESONTABLEprojTOuser2;-- 3. 授予user3权限-- 创建视图限制仅能访问自己的信息CREATEVIEWemp_selfASSELECT*FROMempWHEREenoE001;GRANTSELECTONTABLEemp_selfTOuser3;-- 创建视图仅能查询部门名称CREATEVIEWdept_nameASSELECTdnameFROMdept;GRANTSELECTONTABLEdept_nameTOuser3;-- 4. 收回user1的插入权限REVOKEINSERTONTABLEempFROMuser1;三、参考答案解析权限控制的核心是遵循最小权限原则只给用户分配完成工作所需的最小权限避免权限过度集中带来的安全风险。对于细粒度的权限控制可以通过视图机制实现将用户的访问范围限制在特定行或特定列。嵌入式SQL开发中需要注意主变量的声明规范和使用方法特别是在SQL语句中引用时必须加冒号前缀。SQLCA是错误处理的重要机制每次执行SQL语句后都应该检查SQLCODE或SQLSTATE的值判断执行结果是否符合预期。

更多文章