SQL Server数据库学习知识点大全(三)

简介: 教程来源 https://app-adzoyybqtaf5.appmiaoda.com SQL Server高可用、自动化运维与安全体系:涵盖Always On可用性组配置、日志传送搭建;SQL Server Agent作业调度、警报通知机制;以及登录用户管理、细粒度权限控制、TDE透明加密与列级加密等核心安全实践,助力构建稳定、可控、合规的企业级数据库环境。

七、高可用性

7.1 Always On 可用性组

-- 创建端点
CREATE ENDPOINT [Hadr_endpoint]
STATE = STARTED
AS TCP (
    LISTENER_PORT = 5022,
    LISTENER_IP = ALL
)
FOR DATABASE_MIRRORING (
    AUTHENTICATION = WINDOWS NEGOTIATE,
    ENCRYPTION = REQUIRED ALGORITHM AES,
    ROLE = ALL
);

-- 创建可用性组
CREATE AVAILABILITY GROUP AG_SalesDB
WITH (
    AUTOMATED_BACKUP_PREFERENCE = SECONDARY,
    FAILURE_CONDITION_LEVEL = 3,
    HEALTH_CHECK_TIMEOUT = 30000
)
FOR DATABASE SalesDB
REPLICA ON
    'SQLServer1' WITH (
        ENDPOINT_URL = 'TCP://SQLServer1:5022',
        AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
        FAILOVER_MODE = AUTOMATIC,
        BACKUP_PRIORITY = 50,
        SECONDARY_ROLE (ALLOW_CONNECTIONS = READ_ONLY)
    ),
    'SQLServer2' WITH (
        ENDPOINT_URL = 'TCP://SQLServer2:5022',
        AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
        FAILOVER_MODE = AUTOMATIC,
        BACKUP_PRIORITY = 50,
        SECONDARY_ROLE (ALLOW_CONNECTIONS = READ_ONLY)
    );

-- 创建可用性组监听器
ALTER AVAILABILITY GROUP AG_SalesDB
ADD LISTENER 'SalesDB_Listener' (
    WITH IP (('10.0.0.100', '255.255.255.0')),
    PORT = 1433
);

-- 查看可用性组状态
SELECT 
    ag.name AS AGName,
    ar.replica_server_name,
    rs.role_desc,
    rs.operational_state_desc,
    rs.connected_state_desc,
    rs.synchronization_health_desc
FROM sys.availability_groups ag
INNER JOIN sys.availability_replicas ar ON ag.group_id = ar.group_id
INNER JOIN sys.dm_hadr_availability_replica_states rs 
    ON ar.replica_id = rs.replica_id;

-- 手动故障转移
ALTER AVAILABILITY GROUP AG_SalesDB FAILOVER;

7.2 日志传送

-- 配置日志传送(在主服务器上)
-- 设置备份作业
EXEC sp_add_log_shipping_primary_database
    @database = 'SalesDB',
    @backup_directory = '\\backup_server\LogShipping',
    @backup_share = '\\backup_server\LogShipping',
    @backup_job_name = 'LSBackup_SalesDB',
    @backup_retention_period = 72,
    @monitor_server = 'MonitorServer',
    @monitor_server_security_mode = 1;

-- 添加辅助服务器
EXEC sp_add_log_shipping_primary_secondary
    @primary_database = 'SalesDB',
    @secondary_server = 'SecondaryServer',
    @secondary_database = 'SalesDB_Standby';

-- 查看日志传送状态
SELECT 
    primary_database,
    secondary_server,
    secondary_database,
    last_backup_file,
    last_copied_file,
    last_restored_file,
    last_restored_latency
FROM msdb.dbo.log_shipping_monitor_primary;

八、SQL Server Agent 与作业

8.1 作业管理

-- 创建作业
USE msdb;
GO

EXEC sp_add_job 
    @job_name = 'Daily Database Maintenance',
    @enabled = 1,
    @description = '每日数据库维护作业',
    @notify_level_eventlog = 2,
    @owner_login_name = 'sa';

-- 添加作业步骤
EXEC sp_add_jobstep 
    @job_name = 'Daily Database Maintenance',
    @step_name = 'Backup Database',
    @subsystem = 'TSQL',
    @command = 'BACKUP DATABASE SalesDB TO DISK = ''D:\Backups\SalesDB.bak'' WITH COMPRESSION',
    @on_success_action = 3,
    @retry_attempts = 2,
    @retry_interval = 5;

EXEC sp_add_jobstep 
    @job_name = 'Daily Database Maintenance',
    @step_name = 'Update Statistics',
    @subsystem = 'TSQL',
    @command = 'EXEC sp_updatestats',
    @on_success_action = 1;

-- 创建作业计划
EXEC sp_add_schedule 
    @schedule_name = 'Daily at 2AM',
    @freq_type = 4,  -- 每天
    @freq_interval = 1,
    @active_start_time = 20000;  -- 2:00 AM

-- 关联作业和计划
EXEC sp_attach_schedule 
    @job_name = 'Daily Database Maintenance',
    @schedule_name = 'Daily at 2AM';

-- 添加作业通知
EXEC sp_add_jobserver 
    @job_name = 'Daily Database Maintenance',
    @server_name = '(LOCAL)';

-- 启动作业
EXEC sp_start_job @job_name = 'Daily Database Maintenance';

-- 查看作业历史
SELECT 
    j.name AS JobName,
    jh.step_name,
    jh.run_date,
    jh.run_time,
    jh.run_duration,
    jh.run_status
FROM msdb.dbo.sysjobs j
INNER JOIN msdb.dbo.sysjobhistory jh ON j.job_id = jh.job_id
WHERE j.name = 'Daily Database Maintenance'
ORDER BY jh.run_date DESC, jh.run_time DESC;

8.2 警报与操作员

-- 创建操作员
EXEC msdb.dbo.sp_add_operator
    @name = 'DBA Team',
    @enabled = 1,
    @email_address = 'dba@company.com',
    @pager_address = '1234567890@provider.com',
    @weekday_pager_start_time = 80000,
    @weekday_pager_end_time = 180000;

-- 创建严重性警报
EXEC msdb.dbo.sp_add_alert
    @name = 'Severity 16 Error',
    @message_id = 0,
    @severity = 16,
    @enabled = 1,
    @include_event_description_in = 1,
    @notification_message = '严重性16错误发生',
    @job_name = 'Handle Error';

-- 创建性能条件警报
EXEC msdb.dbo.sp_add_alert
    @name = 'Low Disk Space',
    @performance_condition = 'LogicalDisk|Free Space|C:|<|1024',
    @enabled = 1,
    @notification_message = 'C盘剩余空间不足1GB';

-- 创建错误号警报
EXEC msdb.dbo.sp_add_alert
    @name = 'Deadlock Occurred',
    @message_id = 1205,
    @severity = 0,
    @enabled = 1;

-- 添加通知
EXEC msdb.dbo.sp_add_notification
    @alert_name = 'Severity 16 Error',
    @operator_name = 'DBA Team',
    @notification_method = 1;  -- 电子邮件

九、安全与权限

9.1 登录与用户

-- 创建 Windows 登录
CREATE LOGIN [DOMAIN\UserName] 
FROM WINDOWS 
WITH DEFAULT_DATABASE = master;

-- 创建 SQL Server 登录
CREATE LOGIN AppUser 
WITH PASSWORD = 'StrongP@ssw0rd',
    DEFAULT_DATABASE = SalesDB,
    CHECK_POLICY = ON,
    CHECK_EXPIRATION = ON;

-- 创建数据库用户
USE SalesDB;
CREATE USER AppUser FOR LOGIN AppUser;
CREATE USER DomainUser FOR LOGIN [DOMAIN\UserName];

-- 创建无登录用户
CREATE USER GuestUser WITHOUT LOGIN;

-- 包含数据库用户(SQL Server 2012+)
CREATE USER ContainedUser 
WITH PASSWORD = 'StrongP@ssw0rd',
    DEFAULT_SCHEMA = dbo;

-- 修改登录
ALTER LOGIN AppUser WITH PASSWORD = 'NewP@ssw0rd';
ALTER LOGIN AppUser WITH DEFAULT_DATABASE = SalesDB;
ALTER LOGIN AppUser WITH CHECK_POLICY = OFF;
ALTER LOGIN AppUser ENABLE;
ALTER LOGIN AppUser DISABLE;

-- 删除登录
DROP LOGIN AppUser;

9.2 权限管理

-- 服务器角色
EXEC sp_addsrvrolemember 'AppUser', 'sysadmin';
EXEC sp_addsrvrolemember 'AppUser', 'securityadmin';
EXEC sp_addsrvrolemember 'AppUser', 'serveradmin';
EXEC sp_addsrvrolemember 'AppUser', 'setupadmin';
EXEC sp_addsrvrolemember 'AppUser', 'processadmin';
EXEC sp_addsrvrolemember 'AppUser', 'diskadmin';
EXEC sp_addsrvrolemember 'AppUser', 'dbcreator';
EXEC sp_addsrvrolemember 'AppUser', 'bulkadmin';

-- 数据库角色
EXEC sp_addrolemember 'db_owner', 'AppUser';
EXEC sp_addrolemember 'db_securityadmin', 'AppUser';
EXEC sp_addrolemember 'db_accessadmin', 'AppUser';
EXEC sp_addrolemember 'db_backupoperator', 'AppUser';
EXEC sp_addrolemember 'db_ddladmin', 'AppUser';
EXEC sp_addrolemember 'db_datawriter', 'AppUser';
EXEC sp_addrolemember 'db_datareader', 'AppUser';

-- 创建自定义角色
CREATE ROLE SalesManager;
GRANT SELECT, INSERT, UPDATE ON Sales TO SalesManager;
GRANT EXECUTE ON sp_GetSalesReport TO SalesManager;
EXEC sp_addrolemember 'SalesManager', 'AppUser';

-- 授予对象权限
GRANT SELECT ON Employees TO AppUser;
GRANT INSERT, UPDATE ON Employees TO AppUser;
GRANT DELETE ON Employees TO AppUser WITH GRANT OPTION;  -- 允许传递权限
GRANT EXECUTE ON sp_GetEmployeeDetails TO AppUser;
GRANT REFERENCES ON Employees(EmployeeID) TO AppUser;

-- 拒绝权限
DENY DELETE ON Employees TO AppUser;

-- 撤销权限
REVOKE DELETE ON Employees FROM AppUser;

-- 查看权限
SELECT 
    pr.name AS PrincipalName,
    pr.type_desc AS PrincipalType,
    pe.permission_name,
    pe.state_desc,
    o.name AS ObjectName
FROM sys.database_permissions pe
INNER JOIN sys.database_principals pr ON pe.grantee_principal_id = pr.principal_id
LEFT JOIN sys.objects o ON pe.major_id = o.object_id
WHERE pr.name = 'AppUser';

9.3 数据加密

-- 透明数据加密(TDE)
USE master;
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'StrongP@ssw0rd';

CREATE CERTIFICATE TDECert 
WITH SUBJECT = 'TDE Certificate';

BACKUP CERTIFICATE TDECert 
TO FILE = 'D:\Certificates\TDECert.cer'
WITH PRIVATE KEY (
    FILE = 'D:\Certificates\TDECert.key',
    ENCRYPTION BY PASSWORD = 'CertP@ssw0rd'
);

USE SalesDB;
CREATE DATABASE ENCRYPTION KEY
WITH ALGORITHM = AES_256
ENCRYPTION BY SERVER CERTIFICATE TDECert;

ALTER DATABASE SalesDB SET ENCRYPTION ON;

-- 查看加密状态
SELECT 
    db_name(database_id) AS DatabaseName,
    encryption_state_desc,
    percent_complete
FROM sys.dm_database_encryption_keys;

-- 列级加密
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'MasterKeyP@ss';

CREATE CERTIFICATE ColumnCert 
WITH SUBJECT = 'Column Encryption Certificate';

CREATE SYMMETRIC KEY ColumnKey
WITH ALGORITHM = AES_256
ENCRYPTION BY CERTIFICATE ColumnCert;

-- 创建表并加密列
CREATE TABLE CustomerData (
    CustomerID INT PRIMARY KEY,
    CustomerName NVARCHAR(100),
    CreditCard VARBINARY(MAX)
);

-- 加密数据
OPEN SYMMETRIC KEY ColumnKey
DECRYPTION BY CERTIFICATE ColumnCert;

INSERT INTO CustomerData (CustomerID, CustomerName, CreditCard)
VALUES (
    1, 
    '张三',
    EncryptByKey(Key_GUID('ColumnKey'), '1234-5678-9012-3456')
);

-- 解密数据
SELECT 
    CustomerID,
    CustomerName,
    CONVERT(NVARCHAR, DecryptByKey(CreditCard)) AS CreditCard
FROM CustomerData;

CLOSE SYMMETRIC KEY ColumnKey;

来源:
https://app-adzoyybqtaf5.appmiaoda.com

相关文章
|
4天前
|
人工智能 JSON 机器人
让龙虾成为你的“公众号分身” | 阿里云服务器玩Openclaw
本文带你零成本玩转OpenClaw:学生认证白嫖6个月阿里云服务器,手把手配置飞书机器人、接入免费/高性价比AI模型(NVIDIA/通义),并打造微信公众号“全自动分身”——实时抓热榜、AI选题拆解、一键发布草稿,5分钟完成热点→文章全流程!
10568 53
让龙虾成为你的“公众号分身” | 阿里云服务器玩Openclaw
|
9天前
|
人工智能 JavaScript API
解放双手!OpenClaw Agent Browser全攻略(阿里云+本地部署+免费API+网页自动化场景落地)
“让AI聊聊天、写代码不难,难的是让它自己打开网页、填表单、查数据”——2026年,无数OpenClaw用户被这个痛点困扰。参考文章直击核心:当AI只能“纸上谈兵”,无法实际操控浏览器,就永远成不了真正的“数字员工”。而Agent Browser技能的出现,彻底打破了这一壁垒——它给OpenClaw装上“上网的手和眼睛”,让AI能像真人一样打开网页、点击按钮、填写表单、提取数据,24小时不间断完成网页自动化任务。
2393 5
|
23天前
|
人工智能 JavaScript Ubuntu
5分钟上手龙虾AI!OpenClaw部署(阿里云+本地)+ 免费多模型配置保姆级教程(MiniMax、Claude、阿里云百炼)
OpenClaw(昵称“龙虾AI”)作为2026年热门的开源个人AI助手,由PSPDFKit创始人Peter Steinberger开发,核心优势在于“真正执行任务”——不仅能聊天互动,还能自动处理邮件、管理日程、订机票、写代码等,且所有数据本地处理,隐私完全可控。它支持接入MiniMax、Claude、GPT等多类大模型,兼容微信、Telegram、飞书等主流聊天工具,搭配100+可扩展技能,成为兼顾实用性与隐私性的AI工具首选。
23996 121
|
3天前
|
人工智能 IDE API
2026年国内 Codex 安装教程和使用教程:GPT-5.4 完整指南
Codex已进化为AI编程智能体,不仅能补全代码,更能理解项目、自动重构、执行任务。本文详解国内安装、GPT-5.4接入、cc-switch中转配置及实战开发流程,助你从零掌握“描述需求→AI实现”的新一代工程范式。(239字)
2239 126

热门文章

最新文章