首页
关于
友链
推荐
肥啾解析
百度一下
肥啾GPT
Search
1
宝塔面板登录 phpMyAdmin 提示服务器和客户端上指示的HTTPS之间不匹配
371 阅读
2
Customer complaints evolve with in-car tech
256 阅读
3
JavaScript解析
194 阅读
4
所谓关系
170 阅读
5
解决Edge浏览器提示“此网站已被人举报不安全”
149 阅读
默认分类
网游架设
手机游戏
python
PHP
Mysql
VBA
C++
JAVASCRIPT
javascript基础
Oracle
生产管理
计划控制
ERP系统开发
APS排产
MES研究
考勤系统
CPA
财管
实务
经济法
战略
审计
税法
藏书架
古典名著
世界名著
编程秘籍
攻防渗透
经管书籍
大佬传经
风雅读物
考试相关
心情格言
拾玉良言
外文报刊
外刊随选
Facebook
Twitter
China Daily
软考
登录
Search
标签搜索
期刊读物
古文
何瑜明
累计撰写
193
篇文章
累计收到
154
条评论
首页
栏目
默认分类
网游架设
手机游戏
python
PHP
Mysql
VBA
C++
JAVASCRIPT
javascript基础
Oracle
生产管理
计划控制
ERP系统开发
APS排产
MES研究
考勤系统
CPA
财管
实务
经济法
战略
审计
税法
藏书架
古典名著
世界名著
编程秘籍
攻防渗透
经管书籍
大佬传经
风雅读物
考试相关
心情格言
拾玉良言
外文报刊
外刊随选
Facebook
Twitter
China Daily
软考
页面
关于
友链
推荐
肥啾解析
百度一下
肥啾GPT
搜索到
48
篇与
的结果
2026-05-21
linux后门排查
#!/bin/bash # Linux 后门自动排查脚本(文件版) # 使用方法:chmod +x check.sh && sudo ./check.sh WHITELIST_IPS=( "127.0.0.1" "::1" "192.168." "10." "172.16." "172.17." "172.18." "172.19." "172.20." "172.21." "172.22." "172.23." "172.24." "172.25." "172.26." "172.27." "172.28." "172.29." "172.30." "172.31." "120.27.157.31" ) WHITELIST_PORTS=( "22" "80" "443" "3306" "5432" "6379" "27017" "8080" "8443" "8888" "29000" "29400" "29401" "29200" "29702" "34816" "888" "29301" "29712" ) SUSPECT_KEYWORDS=("curl" "wget" "nc " "bash -i" "perl -e" "python -c" "ruby -e" "php -r" "base64 -d" "/dev/tcp" "/dev/udp") MINER_KEYWORDS=("minerd" "xmrig" "cpuminer" "cryptonight" "stratum" "kdevtmpfsi" "kinsing") log_info() { echo -e "\033[32m[INFO]\033[0m $1"; } log_warn() { echo -e "\033[33m[WARN]\033[0m $1"; } log_error() { echo -e "\033[31m[ERROR]\033[0m $1"; } is_ip_whitelisted() { local ip=$1; for w in "${WHITELIST_IPS[@]}"; do [[ "$ip" == "$w"* ]] && return 0; done; return 1; } is_port_whitelisted() { local port=$1; for p in "${WHITELIST_PORTS[@]}"; do [[ "$port" == "$p" ]] && return 0; done; return 1; } echo "==================== Linux 后门自动排查报告 ====================" echo "时间: $(date) | 主机: $(hostname)" echo "" errors=(); warnings=() cpu_idle=$(top -bn1 | grep "%Cpu" | awk -F 'id' '{print $1}' | awk '{print $NF}') cpu_idle_int=${cpu_idle%.*} if [[ $cpu_idle_int -lt 70 ]]; then log_warn "CPU 空闲率仅 ${cpu_idle_int}%"; warnings+=("CPU过高"); else log_info "CPU 空闲率 ${cpu_idle_int}%"; fi miner_procs=$(ps aux | grep -E "$(IFS='|'; echo "${MINER_KEYWORDS[*]}")" | grep -v grep) if [[ -n "$miner_procs" ]]; then log_error "发现疑似挖矿进程"; errors+=("挖矿进程"); echo "$miner_procs"; else log_info "无挖矿进程"; fi suspect_procs=$(ps aux | grep -E "$(IFS='|'; echo "${SUSPECT_KEYWORDS[*]}")" | grep -v grep) if [[ -n "$suspect_procs" ]]; then log_warn "发现可疑命令行"; warnings+=("可疑进程命令"); echo "$suspect_procs"; else log_info "无可疑进程命令"; fi echo ""; echo "--- 外部连接 ---" external=$(lsof -i -P -n 2>/dev/null | grep -v "127.0.0.1\|::1" | grep ESTABLISHED) if [[ -z "$external" ]]; then log_info "无外部 ESTABLISHED 连接"; else suspicious_conn=0 while IFS= read -r line; do target=$(echo "$line" | awk '{print $NF}' | awk -F'->' '{print $2}') if [[ -n "$target" ]]; then ip=$(echo "$target" | cut -d: -f1) if ! is_ip_whitelisted "$ip"; then log_error "非白名单连接: $target" errors+=("外部连接 $target") suspicious_conn=1 else log_info "白名单连接: $target" fi fi done <<< "$external" if [[ $suspicious_conn -eq 0 ]]; then log_info "所有外部连接均在白名单内"; fi fi echo ""; echo "--- 监听端口 ---" listening_ports=$(netstat -antlp 2>/dev/null | grep LISTEN | grep -v "127.0.0.1\|::1" | awk '{print $4}' | sed 's/.*://' | sort -u) for port in $listening_ports; do if ! is_port_whitelisted "$port"; then log_warn "非常规监听端口: $port" warnings+=("监听端口$port") fi done if [[ -z "$listening_ports" ]]; then log_info "无监听端口(或全部过滤)"; fi echo ""; echo "--- 可疑进程路径 ---" suspicious_paths="" for pid in $(ps -e -o pid=); do if [[ -d /proc/$pid ]]; then exe=$(ls -l /proc/$pid/exe 2>/dev/null | awk '{print $NF}') if [[ "$exe" == "/tmp/"* || "$exe" == "/dev/shm/"* || "$exe" == *"/..."* || "$exe" == " (deleted)" ]]; then cmd=$(cat /proc/$pid/cmdline 2>/dev/null | tr '\0' ' ') suspicious_paths+="PID:$pid EXE:$exe CMD:$cmd\n" fi fi done if [[ -n "$suspicious_paths" ]]; then log_error "发现可疑进程路径"; errors+=("可疑路径"); echo -e "$suspicious_paths"; else log_info "所有进程路径正常"; fi echo ""; echo "--- 计划任务 ---" cron_suspect="" for user in $(cut -f1 -d: /etc/passwd); do cron_suspect+=$(crontab -u $user -l 2>/dev/null) done cron_suspect+=$(cat /etc/crontab 2>/dev/null) cron_suspect+=$(cat /etc/cron.d/* 2>/dev/null | grep -v "^#") if echo "$cron_suspect" | grep -qE "$(IFS='|'; echo "${SUSPECT_KEYWORDS[*]}")"; then log_error "计划任务中存在可疑命令"; errors+=("cron可疑"); echo "$cron_suspect" | grep -E "$(IFS='|'; echo "${SUSPECT_KEYWORDS[*]}")" else log_info "计划任务无异常" fi echo ""; echo "--- SSH authorized_keys ---" if [[ -s /root/.ssh/authorized_keys ]]; then log_warn "SSH authorized_keys 非空,请人工确认"; warnings+=("authorized_keys非空"); cat /root/.ssh/authorized_keys; else log_info "无 SSH authorized_keys 后门"; fi echo ""; echo "--- LD_PRELOAD ---" if [[ -s /etc/ld.so.preload ]]; then log_error "ld.so.preload 存在"; errors+=("ld.so.preload"); cat /etc/ld.so.preload; else log_info "ld.so.preload 正常"; fi echo ""; echo "--- 登录记录 ---" last_output=$(last -20 | grep -v "still logged in") known_ips=$(echo "$last_output" | awk '{print $3}' | grep -E '^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$' | sort -u) for ip in $known_ips; do if ! is_ip_whitelisted "$ip"; then log_error "非白名单IP登录: $ip" errors+=("登录IP $ip") fi done if [[ ${#errors[@]} -eq 0 ]]; then log_info "所有登录IP均在白名单内"; fi echo ""; echo "--- SSH 暴力破解迹象 ---" if [[ -f /var/log/secure ]]; then fail_count=$(grep "Failed password" /var/log/secure 2>/dev/null | wc -l) elif [[ -f /var/log/auth.log ]]; then fail_count=$(grep "Failed password" /var/log/auth.log 2>/dev/null | wc -l) else fail_count=0 fi if [[ $fail_count -gt 100 ]]; then log_warn "SSH失败尝试次数较多 ($fail_count)"; warnings+=("暴力破解迹象"); else log_info "SSH失败尝试较少 ($fail_count)"; fi echo ""; echo "==================== 综合结论 ====================" if [[ ${#errors[@]} -gt 0 ]]; then echo -e "\033[31m❌ 检测到明确恶意迹象!请立即处理。\033[0m" printf " - %s\n" "${errors[@]}" echo "建议:封禁IP、杀进程、删文件、改密码,必要时重装系统。" elif [[ ${#warnings[@]} -gt 0 ]]; then echo -e "\033[33m⚠️ 发现可疑迹象,建议人工复核。\033[0m" printf " - %s\n" "${warnings[@]}" else echo -e "\033[32m✅ 未发现明显后门迹象。系统基本安全。\033[0m" fi直接在root目录下新建文件check.sh,贴入上面内容回到根目录运行 ./check.sh显示结果参考[root@ah-ipv6 ~]# ./check.sh ==================== Linux 后门自动排查报告 ==================== 时间: 2026年 05月 21日 星期四 15:02:39 CST | 主机: ah-ipv6 [INFO] CPU 空闲率 96% [INFO] 无挖矿进程 [INFO] 无可疑进程命令 --- 外部连接 --- [INFO] 所有外部连接均在白名单内 --- 监听端口 --- --- 可疑进程路径 --- [INFO] 所有进程路径正常 --- 计划任务 --- [INFO] 计划任务无异常 --- SSH authorized_keys --- [INFO] 无 SSH authorized_keys 后门 --- LD_PRELOAD --- [INFO] ld.so.preload 正常 --- 登录记录 --- [INFO] 所有登录IP均在白名单内 --- SSH 暴力破解迹象 --- [INFO] SSH失败尝试较少 (0) ==================== 综合结论 ==================== ✅ 未发现明显后门迹象。系统基本安全。 [root@ah-ipv6 ~]#
2026年05月21日
1 阅读
0 评论
0 点赞
2026-05-21
卸载ollama模型命令
[root@ah-ipv6 ~]# docker exec -it ollama ollama list NAME ID SIZE MODIFIED deepseek-r1:7b 755ced02ce7b 4.7 GB 21 minutes ago [root@ah-ipv6 ~]# docker exec -it ollama ollama rm deepseek-r1:7b deleted 'deepseek-r1:7b' [root@ah-ipv6 ~]# docker exec -it ollama ollama list NAME ID SIZE MODIFIED [root@ah-ipv6 ~]# docker exec -it ollama sh -c "rm -rf /root/.ollama/models/blobs/* 2>/dev/null || true" [root@ah-ipv6 ~]# docker exec -it ollama ollama run deepseek-r1:1.5b
2026年05月21日
1 阅读
0 评论
0 点赞
2026-05-20
centos7.9安装ds蒸馏模型记录
安装 Ollamacurl -fsSL https://ollama.com/install.sh | sh报错[root@ah-ipv6 ~]# curl -fsSL https://ollama.com/install.sh | sh >>> Installing ollama to /usr/local ERROR: This version requires zstd for extraction. Please install zstd and try again: - Debian/Ubuntu: sudo apt-get install zstd - RHEL/CentOS/Fedora: sudo dnf install zstd - Arch: sudo pacman -S zstd [root@ah-ipv6 ~]#安装报错是因为 Ollama 的安装脚本需要 zstd 这个压缩工具来解压文件。这个错误信息已经直接给出了解决方案:先安装 zstd 再重试即可。安装 zstdsudo dnf install -y zstd还是报错[root@ah-ipv6 ~]# sudo dnf install -y zstd sudo: dnf:找不到命令 [root@ah-ipv6 ~]#报错 sudo: dnf:找不到命令 说明系统中没有 dnf 这个包管理器。这是因为 CentOS 7 及更早的 RHEL 系统默认使用 yum 作为包管理器,并未预装 dnf。此系统应该也属于这种情况。CentOS 7 的 yum 官方源已停用,以及某些第三方源(如 EPEL)因压缩格式不兼容也会报错。使用正确的包管理器安装 zstd[root@ah-ipv6 ~]# # 清理yum缓存并生成新缓存 [root@ah-ipv6 ~]# sudo yum clean all 已加载插件:fastestmirror, product-id, search-disabled-repos, subscription-manager This system is not registered with an entitlement server. You can use subscription-manager to register. 正在清理软件源: base cloudflared-stable docker-ce-stable epel extras updates Cleaning up list of fastest mirrors [root@ah-ipv6 ~]# sudo yum makecache 已加载插件:fastestmirror, product-id, search-disabled-repos, subscription-manager This system is not registered with an entitlement server. You can use subscription-manager to register. Determining fastest mirrors epel/x86_64/metalink | 4.2 kB 00:00:00 * base: mirrors.aliyun.com * epel: d2lzkl7pfhq30w.cloudfront.net * extras: mirrors.aliyun.com * updates: mirrors.aliyun.com base | 3.6 kB 00:00:00 cloudflared-stable | 1.5 kB 00:00:00 docker-ce-stable | 3.5 kB 00:00:00 epel | 4.3 kB 00:00:00 extras | 2.9 kB 00:00:00 updates | 2.9 kB 00:00:00 (1/22): base/7/x86_64/group_gz | 153 kB 00:00:00 (2/22): base/7/x86_64/primary_db | 6.1 MB 00:00:03 (3/22): base/7/x86_64/filelists_db | 7.2 MB 00:00:03 (4/22): docker-ce-stable/x86_64/updateinfo | 55 B 00:00:00 (5/22): docker-ce-stable/x86_64/filelists_db | 66 kB 00:00:00 (6/22): docker-ce-stable/x86_64/primary_db | 152 kB 00:00:00 (7/22): docker-ce-stable/x86_64/other_db | 145 kB 00:00:00 (8/22): base/7/x86_64/other_db | 2.6 MB 00:00:01 (9/22): epel/x86_64/group | 399 kB 00:00:00 (10/22): cloudflared-stable/filelists | 377 B 00:00:02 (11/22): cloudflared-stable/other | 423 B 00:00:02 (12/22): epel/x86_64/filelists_db | 15 MB 00:00:01 (13/22): epel/x86_64/updateinfo | 1.0 MB 00:00:00 (14/22): epel/x86_64/prestodelta | 592 B 00:00:00 (15/22): epel/x86_64/primary_db | 8.7 MB 00:00:00 (16/22): extras/7/x86_64/filelists_db | 305 kB 00:00:00 (17/22): extras/7/x86_64/other_db | 154 kB 00:00:00 (18/22): extras/7/x86_64/primary_db | 253 kB 00:00:00 (19/22): epel/x86_64/other_db | 4.1 MB 00:00:00 (20/22): updates/7/x86_64/filelists_db | 15 MB 00:00:08 (21/22): updates/7/x86_64/other_db | 1.6 MB 00:00:00 (22/22): updates/7/x86_64/primary_db | 27 MB 00:00:15 One of the configured repositories failed (未知), and yum doesn't have enough cached data to continue. At this point the only safe thing yum can do is fail. There are a few ways to work "fix" this: 1. Contact the upstream for the repository and get them to fix the problem. 2. Reconfigure the baseurl/etc. for the repository, to point to a working upstream. This is most often useful if you are using a newer distribution release than is supported by the repository (and the packages for the previous distribution release still work). 3. Run the command with the repository temporarily disabled yum --disablerepo=<repoid> ... 4. Disable the repository permanently, so yum won't use it by default. Yum will then just ignore the repository until you permanently enable it again or use --enablerepo for temporary usage: yum-config-manager --disable <repoid> or subscription-manager repos --disable=<repoid> 5. Configure the failing repository to be skipped, if it is unavailable. Note that yum will try to contact the repo. when it runs most commands, so will have to try and fail each time (and thus. yum will be be much slower). If it is a very temporary problem though, this is often a nice compromise: yum-config-manager --save --setopt=<repoid>.skip_if_unavailable=true Parsing primary.xml error: Start tag expected, '<' not found [root@ah-ipv6 ~]#看起来问题出在 cloudflared-stable 或 docker-ce-stable 这两个第三方仓库的元数据损坏了,导致 yum makecache 整体失败。我们可以暂时禁用它们,只从 CentOS 官方源和 EPEL 源安装 zstd。# 1. 禁用有问题的仓库,然后安装 zstd sudo yum --disablerepo=cloudflared-stable --disablerepo=docker-ce-stable install -y zstd运行结果[root@ah-ipv6 ~]# sudo yum --disablerepo=cloudflared-stable --disablerepo=docker-ce-stable install -y zstd 已加载插件:fastestmirror, product-id, search-disabled-repos, subscription-manager This system is not registered with an entitlement server. You can use subscription-manager to register. Loading mirror speeds from cached hostfile epel/x86_64/metalink | 4.2 kB 00:00:00 * base: mirrors.aliyun.com * epel: d2lzkl7pfhq30w.cloudfront.net * extras: mirrors.aliyun.com * updates: mirrors.aliyun.com base | 3.6 kB 00:00:00 extras | 2.9 kB 00:00:00 updates | 2.9 kB 00:00:00 正在解决依赖关系 --> 正在检查事务 ---> 软件包 zstd.x86_64.0.1.5.5-1.el7 将被 安装 --> 解决依赖关系完成 依赖关系解决 ================================================================================================================================================================================================= Package 架构 版本 源 大小 ================================================================================================================================================================================================= 正在安装: zstd x86_64 1.5.5-1.el7 epel 449 k 事务概要 ================================================================================================================================================================================================= 安装 1 件包 总下载量:449 k 安装大小:1.7 M Downloading packages: zstd-1.5.5-1.el7.x86_64.rpm | 449 kB 00:00:00 Running transaction check Running transaction test Transaction test succeeded Running transaction 正在安装 : zstd-1.5.5-1.el7.x86_64 1/1 验证中 : zstd-1.5.5-1.el7.x86_64 1/1 已安装: zstd.x86_64 0:1.5.5-1.el7 完毕! [root@ah-ipv6 ~]#zstd 已经成功安装。现在继续安装 Ollama:curl -fsSL https://ollama.com/install.sh | sh安装完成后,验证一下:ollama --version正常输出版本号(例如 ollama version is 0.5.1),就可以拉取并运行模型了。ollama run deepseek-r1:7bOllama 会自动下载模型并启动对话。出现 >>> Send a message (/? for help) 提示时,就说明成功了。
2026年05月20日
1 阅读
0 评论
0 点赞
2026-04-21
SQL语言应用:高级查询与数据库编程
旨在考查对SQL语言的掌握深度,从基础的增删改查,到复杂的多表连接、子查询、事务控制,乃至存储过程和触发器等数据库编程技术。{dotted startColor="#ff6c6c" endColor="#1989fa"/}复杂查询与优化核心考点与出题思想多表连接查询:这是SQL查询的绝对核心,要求能够根据业务需求,正确选择合适的连接类型并编写关联条件。内连接(INNER JOIN):返回两表中满足连接条件的记录。这是最常用的连接类型。外连接(OUTER JOIN):包括左外连接(LEFT JOIN)、右外连接(RIGHT JOIN)和全外连接(FULL JOIN)。它们分别保证左表、右表或两表的所有记录都被返回,即使在另一表中没有匹配的记录。考试中常出现需要查询“所有学生及其选课情况”(包括未选课的学生)的场景,这必须使用左外连接。子查询:子查询是嵌套在另一个查询语句中的SELECT语句,是解决复杂问题的利器。where子查询:将子查询的结果作为外层查询的过滤条件。例如,“查询与‘张三’在同一个部门的员工”。from子查询:将子查询的结果作为一个临时表,供外层查询使用。exists子查询:用于检查是否存在满足某种条件的记录,返回布尔值(TRUE或FALSE)。这是历年考试中极易出现的考点,尤其是“双重否定”形式的查询,如“查询没有选修任何课程的学生的学号”。这种查询通常使用NOT EXISTS关键字,其逻辑是检查子查询是否返回空集。集合操作:UNION(并)、INTERSECT(交)、EXCEPT(差)。窗口函数:这是近年来越来越重要的一个考点。ROW_NUMBER()、RANK()、DENSE_RANK()等函数可以用于分组排序,在解决“第N高工资”、“成绩排名”等问题时非常高效。解题策略与避坑指南明确查询目标与数据源:在动笔写SQL之前,务必搞清楚最终需要输出哪些列,以及这些列分别来自哪些表。这是构建正确查询的逻辑基础。选择合适的连接方式:如果需要返回两个表都匹配的记录,用INNER JOIN。如果需要返回左边表的所有记录,并根据条件匹配右边表,用LEFT JOIN。如果需要返回右边表的所有记录,并根据条件匹配左边表,用RIGHT JOIN。处理双重否定:遇到“没有”、“从未”、“全部”等关键词时,应首先考虑使用NOT IN或NOT EXISTS。理解两者的区别至关重要:NOT IN子查询的结果集不能包含NULL值,如果子查询可能返回NULL,则整个查询结果将为空,这是常见的逻辑陷阱。而NOT EXISTS不受NULL值的影响,通常更为安全和高效。验证逻辑:写完SQL后,建议用草稿纸模拟少量数据,走查SQL的逻辑流程,特别是对于复杂的嵌套子查询和连接,这一步能有效发现潜在的逻辑错误{dotted startColor="#ff6c6c" endColor="#1989fa"/}数据库对象与数据控制核心考点与出题思想这部分内容主要考查对数据库核心组件的创建、管理和控制能力,包括表、视图、索引和完整性约束。表的定义与完整性约束:主键约束(PRIMARY KEY):唯一且非空,用于实体完整性。外键约束(FOREIGN KEY):引用另一个表的主键,用于保证参照完整性。外键约束可以定义级联操作(ON DELETE CASCADE/SET NULL),这是一个重要考点。唯一约束(UNIQUE):保证列中所有值互不相同,但允许NULL值(取决于具体数据库系统)。检查约束(CHECK):用于强制域完整性,确保列中的值满足指定的条件(如性别只能为‘男’或‘女’,年龄必须大于0。视图(VIEW):视图是一个虚拟表,其内容由一个查询定义。WITH CHECK OPTION:这是一个关键选项。当通过视图插入或修改数据时,WITH CHECK OPTION会确保这些操作满足视图的WHERE子句条件,否则操作将被拒绝 。索引(INDEX):唯一索引(UNIQUE INDEX):确保索引列中没有重复值。聚簇索引(CLUSTER INDEX):这是一种特殊的索引,它会改变表中数据的物理存储顺序,使其与索引键的顺序一致。一个表只能有一个聚簇索引。解题策略与避坑指南完整性约束的综合应用:在创建表时,经常需要同时定义多种约束。需要注意PRIMARY KEY、FOREIGN KEY和UNIQUE约束在语法上的区别。一个常见错误是将UNIQUE和NOT NULL约束混用,实际上,在多数数据库中,UNIQUE约束本身就隐含了对非空值的唯一性保证,但对于主键,必须显式指定NOT NULL。理解WITH CHECK OPTION:这个选项的功能是考试中极易设置“陷阱”的地方。必须明确,它的作用是限制对视图的DML操作,使其只能作用于视图“可见”的那部分数据行。索引的权衡:索引能加速查询,但会降低写入速度并占用额外存储空间。考试中常要求为某个查询需求选择合适的索引类型。原则是:通常在WHERE子句中的列、JOIN条件中的列、以及ORDER BY或GROUP BY涉及的列上创建索引。{dotted startColor="#ff6c6c" endColor="#1989fa"/}存储过程与触发器核心考点与出题思想存储过程和触发器是实现复杂业务规则和自动化数据处理的重要工具,是SQL语言应用模块中的难点。存储过程(Stored Procedure):存储过程是一组为了完成特定功能的T-SQL语句集合,它被编译后存储在数据库中,可以通过名称和参数来调用。它能够提高代码的重用性、执行效率和安全性。触发器(Trigger):触发器是一种特殊的存储过程,它在指定的数据修改语句(INSERT、UPDATE、DELETE)执行之前(BEFORE)或之后(AFTER)被自动触发执行。临时表:在触发器内部,通常可以使用REFERENCING子句来引用两个逻辑上的临时表:inserted:包含了INSERT或UPDATE语句所影响的新行。deleted:包含了DELETE或UPDATE语句所影响的旧行。触发器常用于实现复杂的业务验证、审计日志记录、数据的自动计算与同步等功能。解题策略与避坑指南存储过程 vs. 触发器:这是概念辨析题的常考内容。核心区别在于它们的执行方式。存储过程是一个命名的代码块,需要显式调用;而触发器与表紧密关联,是自动、隐式被激发执行的,用户对它的调用无感知。触发器逻辑编写:在编写触发器时,首先要明确触发事件(Insert、Update 或 Delete)以及触发时机(BEFORE 或 AFTER)。熟练掌握inserted和deleted临时表的使用。例如,在一个INSERT触发器中,新插入的数据存储在inserted表中;在一个UPDATE触发器中,更新前的数据存储在deleted表中,更新后的数据存储在inserted表中。触发器的动作主体(即BEGIN和END之间的SQL代码)必须能够正确处理多行数据。由于一次INSERT、UPDATE或DELETE操作可能影响多行数据,因此inserted和deleted表中可能包含多行记录,触发器内的逻辑应避免使用假设只操作单行数据的变量。核心数据库对象对比
2026年04月21日
2 阅读
0 评论
0 点赞
2026-04-20
数据库设计的艺术:从概念模型到规范化理论
该模块的核心在于,掌握从需求分析到最终的逻辑模型设计与优化的完整流程。1.1 实体-联系(E-R)模型深度解析核心考点与出题思想E-R模型是概念结构设计阶段的基石,其考查形式已从简单的实体识别和图形补全,演变为对复杂业务场景的抽象和建模能力。基础构成:E-R模型由三个基本元素构成:实体(矩形表示)、属性(椭圆表示)和联系(菱形表示)。实体代表现实世界中的事物,如“学生”、“课程”;属性描述实体的特征,如“学号”、“课程名”;联系则表示实体之间的相互作用或关联,如“选课”、“授课” 。联系的类型:这是考试中必考的核心概念。1:1(一对一):如一个班级与一个辅导员、一个公民与其身份证。1:**(一对多):如一个部门与多名员工、一个作者与多本书。:(多对多):如学生与课程(一个学生可选多门课,一门课可由多个学生选)、作者与书籍(一本书可有多个作者,一个作者可写多本书)。近年高频考点与“陷阱”:三元联系与聚合:这是区分普通考生与高手的关键分水岭。考试中经常出现需要三个或更多实体同时参与的复杂联系。三元联系:指一个联系集同时关联三个实体集,三者缺一不可。例如,“供应商供应零件给项目”,这涉及到供应商、零件、项目三个实体,且三者必须同时存在才能构成一次供应行为。聚合(Aggregation):是一种特殊的联系,它将一个联系集本身视为一个“超实体”,再与另一个实体集发生联系。例如,“经理管理项目”,其中“项目”本身可能是由“员工”和“任务”两个实体通过“分配”联系构成的一个聚合体,经理管理的是这个聚合体。出题者经常在这两个概念上设置陷阱,要求考生根据题干的语义精确判断。弱实体:指一个实体的存在必须依赖于另一个实体。例如,“家属”实体必须依赖于“员工”实体而存在;没有员工,家属就失去了存在的意义。在E-R图中,弱实体用双线矩形表示,它与依赖实体之间的联系用双线菱形表示 。解题策略与避坑指南精读题干,识别关键元素:首先,通读题目说明,圈出所有名词,这些名词往往是潜在的实体。接着,分析名词之间的动词或关系短语,这些是潜在的联系。对于模糊的关系,需要结合上下文和常识进行判断 。确定联系基数:依据题干描述,判断实体之间的联系是一对一、一对多还是多对多。一个常用的经验法则是:如果题目中出现“若干”、“多个”、“至少一个”等词汇,通常指向 : 或 1:* 的联系 。区分复杂联系:这是最易失分的环节。考生必须清晰区分三元联系和聚合。关键在于判断联系的参与者是否是“同时且缺一不可”的。如果是,则为三元联系;如果存在逻辑上的层次和先后顺序(即先有两个实体的联系,这个联系再与第三个实体发生关系),则为聚合。1.2 关系规范化理论实战指南核心考点与出题思想关系规范化理论旨在指导逻辑结构设计,通过消除数据冗余和操作异常来优化关系模式。考试中,该理论通常与E-R模型转换后的结果紧密结合,考查考生对函数依赖的理解和对范式级别的判断能力。范式演进:第一范式(1NF):这是最低要求,指关系模式中的每个属性都是不可再分的原子数据项。例如,“电话”属性中如果存储了多个用逗号分隔的电话号码,就违反了1NF 。第二范式(2NF):在满足1NF的基础上,消除非主属性对候选键的部分函数依赖。这意味着,如果一个表的主键由多个属性组成(复合主键),那么所有非主属性都必须完全依赖于这个完整的组合,而不能只依赖于其中的一部分 14。例如,在选课表(学号,课程号,成绩,学分)中,“学分”只依赖于“课程号”,这就是对主键(学号,课程号)的部分依赖,违反了2NF。第三范式(3NF):在满足2NF的基础上,消除非主属性对候选键的传递函数依赖。即非主属性不能依赖于其他非主属性 14。例如,在学生表(学号,姓名,系别,系主任)中,存在“学号 -> 系别”和“系别 -> 系主任”的依赖关系,因此“系主任”传递依赖于主键“学号”,违反了3NF。BCNF(巴斯-科德范式):这是3NF的加强版,旨在消除主属性对候选键的部分和传递函数依赖。它要求所有函数依赖的左侧(决定因素)都必须是候选键 。解题策略与避坑指南寻找候选键:这是规范化分析的第一步,也是至关重要的一步。候选键是能唯一标识一条记录的最小属性集合。通常优先选择带有编号、ID的属性。如果单个属性不能唯一标识,则需要考虑由多个属性组成的复合候选键。构建函数依赖集:根据题干的业务语义和常识,推导出所有直接和隐含的函数依赖关系。例如,“员工ID -> 员工姓名”,“部门ID -> 部门名称”等。判断范式级别:从1NF开始,逐级向上检查。检查2NF:看是否存在非主属性对复合主键的部分依赖。如果主键是单一属性,则自动满足2NF。检查3NF:看是否存在非主属性之间的传递依赖。检查BCNF:看是否存在左侧不是候选键的函数依赖。这是BCNF最常见的考查点,也是考生容易忽视的“坑”。从E-R模型到关系模式的完整流程该流程是下午案例题的标准考查路径,考生必须形成一套标准化的操作步骤。实体转换为关系模式:每个实体通常转换为一个独立的关系(表)。实体的主键成为关系的主键,实体的所有属性成为关系的属性 。联系转换为关系模式:这是转换过程中的重点和难点,需根据联系的类型采用不同的策略。1:1联系:通常有三种实现方式。最常用的是将一端实体的键作为外键加入到另一端实体的关系中;或者将两个实体的主键合并,并添加联系本身的属性;也可以创建一个独立的关系,包含两个实体的主键作为外键。1:联系:标准的做法是将“1”端实体的主键作为外键加入到“”端实体的关系中 。:联系:必须转换为一个独立的关系。该关系的主键由“**”两端实体的主键组合而成,并包含联系本身的属性。这是考试中绝对的高频考点。通过以上步骤,将得到一个初步的、可能不符合高级范式的关系模式集合,随后便可应用规范化理论对其进行优化。表格1:E-R模型元素与关系模式的转换规则总结
2026年04月20日
3 阅读
0 评论
0 点赞
1
2
3
...
10
0:00