-- 外部接口日志表和 30 天保留策略 -- 目标库:FTC25009-WMS IF OBJECT_ID(N'dbo.bas_api_log', N'U') IS NULL BEGIN CREATE TABLE dbo.bas_api_log ( id bigint IDENTITY(1,1) NOT NULL, direction varchar(16) NOT NULL, sys_code varchar(50) NULL, interface_name nvarchar(100) NULL, request_url nvarchar(500) NULL, request_method varchar(20) NULL, request_body nvarchar(max) NULL, response_body nvarchar(max) NULL, msg_type varchar(20) NULL, http_status int NULL, cost_ms bigint NULL, status varchar(30) NULL, error_msg nvarchar(2000) NULL, source_ip varchar(80) NULL, trace_id varchar(80) NULL, create_time datetime2(7) NOT NULL CONSTRAINT DF_bas_api_log_create_time DEFAULT GETDATE(), CONSTRAINT PK_bas_api_log PRIMARY KEY CLUSTERED(id) ); END GO IF COL_LENGTH(N'dbo.bas_api_log', N'direction') IS NULL BEGIN ALTER TABLE dbo.bas_api_log ADD direction varchar(16) NULL; EXEC(N'UPDATE dbo.bas_api_log SET direction = ''UNKNOWN'' WHERE direction IS NULL'); END GO IF COL_LENGTH(N'dbo.bas_api_log', N'request_method') IS NULL BEGIN ALTER TABLE dbo.bas_api_log ADD request_method varchar(20) NULL; END GO IF COL_LENGTH(N'dbo.bas_api_log', N'source_ip') IS NULL BEGIN ALTER TABLE dbo.bas_api_log ADD source_ip varchar(80) NULL; END GO IF COL_LENGTH(N'dbo.bas_api_log', N'trace_id') IS NULL BEGIN ALTER TABLE dbo.bas_api_log ADD trace_id varchar(80) NULL; END GO IF COLUMNPROPERTY(OBJECT_ID(N'dbo.bas_api_log'), 'id', 'IsIdentity') = 0 AND NOT EXISTS ( SELECT 1 FROM sys.default_constraints dc JOIN sys.columns c ON c.object_id = dc.parent_object_id AND c.column_id = dc.parent_column_id WHERE dc.parent_object_id = OBJECT_ID(N'dbo.bas_api_log') AND c.name = N'id' ) BEGIN DECLARE @apiLogStartId bigint; SELECT @apiLogStartId = ISNULL(MAX(CAST(id AS bigint)), 0) + 1 FROM dbo.bas_api_log; IF OBJECT_ID(N'dbo.seq_bas_api_log_id', N'SO') IS NULL BEGIN DECLARE @createSeqSql nvarchar(max) = N'CREATE SEQUENCE dbo.seq_bas_api_log_id AS bigint START WITH ' + CAST(@apiLogStartId AS nvarchar(30)) + N' INCREMENT BY 1'; EXEC(@createSeqSql); END; ALTER TABLE dbo.bas_api_log ADD CONSTRAINT DF_bas_api_log_id DEFAULT (NEXT VALUE FOR dbo.seq_bas_api_log_id) FOR id; END GO IF EXISTS ( SELECT 1 FROM sys.columns WHERE object_id = OBJECT_ID(N'dbo.bas_api_log') AND name = N'request_url' AND max_length < 1000 ) BEGIN ALTER TABLE dbo.bas_api_log ALTER COLUMN request_url nvarchar(500) NULL; END GO IF EXISTS ( SELECT 1 FROM sys.columns WHERE object_id = OBJECT_ID(N'dbo.bas_api_log') AND name = N'request_body' AND system_type_id IN (167, 231) AND max_length <> -1 ) BEGIN ALTER TABLE dbo.bas_api_log ALTER COLUMN request_body nvarchar(max) NULL; END GO IF EXISTS ( SELECT 1 FROM sys.columns WHERE object_id = OBJECT_ID(N'dbo.bas_api_log') AND name = N'response_body' AND system_type_id IN (167, 231) AND max_length <> -1 ) BEGIN ALTER TABLE dbo.bas_api_log ALTER COLUMN response_body nvarchar(max) NULL; END GO IF EXISTS ( SELECT 1 FROM sys.columns WHERE object_id = OBJECT_ID(N'dbo.bas_api_log') AND name = N'error_msg' AND system_type_id IN (167, 231) AND max_length < 4000 ) BEGIN ALTER TABLE dbo.bas_api_log ALTER COLUMN error_msg nvarchar(2000) NULL; END GO IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE object_id = OBJECT_ID(N'dbo.bas_api_log') AND name = N'IX_bas_api_log_create_time') BEGIN EXEC(N'CREATE INDEX IX_bas_api_log_create_time ON dbo.bas_api_log(create_time)'); END GO IF COL_LENGTH(N'dbo.bas_api_log', N'direction') IS NOT NULL AND NOT EXISTS (SELECT 1 FROM sys.indexes WHERE object_id = OBJECT_ID(N'dbo.bas_api_log') AND name = N'IX_bas_api_log_direction_sys') BEGIN EXEC(N'CREATE INDEX IX_bas_api_log_direction_sys ON dbo.bas_api_log(direction, sys_code, create_time DESC)'); END GO IF OBJECT_ID(N'dbo.proc_clean_bas_api_log', N'P') IS NOT NULL BEGIN DROP PROCEDURE dbo.proc_clean_bas_api_log; END GO CREATE PROCEDURE dbo.proc_clean_bas_api_log AS BEGIN SET NOCOUNT ON; DELETE FROM dbo.bas_api_log WHERE create_time < DATEADD(DAY, -30, GETDATE()); END GO DECLARE @apiLogJobId bigint = 9010; DECLARE @jobIdIsIdentity bit = COLUMNPROPERTY(OBJECT_ID(N'dbo.sys_job'), 'job_id', 'IsIdentity'); IF NOT EXISTS (SELECT 1 FROM dbo.sys_job WHERE invoke_target = N'apiLogCleanupTask.cleanExpiredApiLogs()') BEGIN IF @jobIdIsIdentity = 1 SET IDENTITY_INSERT dbo.sys_job ON; INSERT INTO dbo.sys_job ( job_id, job_name, job_group, invoke_target, cron_expression, misfire_policy, concurrent, status, create_by, create_time, update_by, update_time, remark ) VALUES ( @apiLogJobId, N'外部接口日志30天清理', N'DEFAULT', N'apiLogCleanupTask.cleanExpiredApiLogs()', N'0 30 2 * * ?', N'3', N'1', N'0', N'admin', GETDATE(), N'', NULL, N'清理 bas_api_log 中 30 天前的日志' ); IF @jobIdIsIdentity = 1 SET IDENTITY_INSERT dbo.sys_job OFF; END ELSE BEGIN UPDATE dbo.sys_job SET job_name = N'外部接口日志30天清理', cron_expression = N'0 30 2 * * ?', misfire_policy = N'3', concurrent = N'1', status = N'0', update_time = GETDATE(), remark = N'清理 bas_api_log 中 30 天前的日志' WHERE invoke_target = N'apiLogCleanupTask.cleanExpiredApiLogs()'; END GO