193 lines
7.7 KiB
Transact-SQL
193 lines
7.7 KiB
Transact-SQL
-- 创建用户刷新令牌表
|
||
-- 用于实现双 Token 认证机制(Access Token + Refresh Token)
|
||
|
||
-- 创建用户刷新令牌表
|
||
IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = 'user_refresh_tokens')
|
||
BEGIN
|
||
CREATE TABLE user_refresh_tokens (
|
||
id BIGINT IDENTITY(1,1) NOT NULL,
|
||
user_id INT NOT NULL,
|
||
token_hash NVARCHAR(256) NOT NULL,
|
||
expires_at DATETIME2 NOT NULL,
|
||
created_at DATETIME2 NOT NULL DEFAULT GETDATE(),
|
||
created_by_ip NVARCHAR(50) NULL,
|
||
revoked_at DATETIME2 NULL,
|
||
revoked_by_ip NVARCHAR(50) NULL,
|
||
replaced_by_token NVARCHAR(256) NULL,
|
||
CONSTRAINT pk_user_refresh_tokens PRIMARY KEY (id),
|
||
CONSTRAINT fk_user_refresh_tokens_users FOREIGN KEY (user_id)
|
||
REFERENCES users(id) ON DELETE CASCADE
|
||
);
|
||
|
||
-- 创建索引
|
||
CREATE INDEX ix_user_refresh_tokens_user_id ON user_refresh_tokens(user_id);
|
||
CREATE INDEX ix_user_refresh_tokens_token_hash ON user_refresh_tokens(token_hash);
|
||
CREATE INDEX ix_user_refresh_tokens_expires_at ON user_refresh_tokens(expires_at);
|
||
|
||
PRINT N'创建用户刷新令牌表 user_refresh_tokens 成功';
|
||
END
|
||
ELSE
|
||
BEGIN
|
||
PRINT N'用户刷新令牌表 user_refresh_tokens 已存在';
|
||
END
|
||
GO
|
||
|
||
-- 添加表注释
|
||
IF EXISTS (SELECT * FROM sys.tables WHERE name = 'user_refresh_tokens')
|
||
BEGIN
|
||
-- 检查是否已存在表注释
|
||
IF NOT EXISTS (
|
||
SELECT * FROM sys.extended_properties
|
||
WHERE major_id = OBJECT_ID('user_refresh_tokens')
|
||
AND minor_id = 0
|
||
AND name = 'MS_Description'
|
||
)
|
||
BEGIN
|
||
EXEC sp_addextendedproperty
|
||
@name = N'MS_Description',
|
||
@value = N'用户刷新令牌表,存储 Refresh Token 信息用于双 Token 认证机制',
|
||
@level0type = N'SCHEMA', @level0name = N'dbo',
|
||
@level1type = N'TABLE', @level1name = N'user_refresh_tokens';
|
||
END
|
||
|
||
-- 添加列注释
|
||
IF NOT EXISTS (
|
||
SELECT * FROM sys.extended_properties
|
||
WHERE major_id = OBJECT_ID('user_refresh_tokens')
|
||
AND minor_id = (SELECT column_id FROM sys.columns WHERE object_id = OBJECT_ID('user_refresh_tokens') AND name = 'id')
|
||
AND name = 'MS_Description'
|
||
)
|
||
BEGIN
|
||
EXEC sp_addextendedproperty
|
||
@name = N'MS_Description',
|
||
@value = N'主键ID',
|
||
@level0type = N'SCHEMA', @level0name = N'dbo',
|
||
@level1type = N'TABLE', @level1name = N'user_refresh_tokens',
|
||
@level2type = N'COLUMN', @level2name = N'id';
|
||
END
|
||
|
||
IF NOT EXISTS (
|
||
SELECT * FROM sys.extended_properties
|
||
WHERE major_id = OBJECT_ID('user_refresh_tokens')
|
||
AND minor_id = (SELECT column_id FROM sys.columns WHERE object_id = OBJECT_ID('user_refresh_tokens') AND name = 'user_id')
|
||
AND name = 'MS_Description'
|
||
)
|
||
BEGIN
|
||
EXEC sp_addextendedproperty
|
||
@name = N'MS_Description',
|
||
@value = N'用户ID',
|
||
@level0type = N'SCHEMA', @level0name = N'dbo',
|
||
@level1type = N'TABLE', @level1name = N'user_refresh_tokens',
|
||
@level2type = N'COLUMN', @level2name = N'user_id';
|
||
END
|
||
|
||
IF NOT EXISTS (
|
||
SELECT * FROM sys.extended_properties
|
||
WHERE major_id = OBJECT_ID('user_refresh_tokens')
|
||
AND minor_id = (SELECT column_id FROM sys.columns WHERE object_id = OBJECT_ID('user_refresh_tokens') AND name = 'token_hash')
|
||
AND name = 'MS_Description'
|
||
)
|
||
BEGIN
|
||
EXEC sp_addextendedproperty
|
||
@name = N'MS_Description',
|
||
@value = N'Token 哈希值(SHA256)',
|
||
@level0type = N'SCHEMA', @level0name = N'dbo',
|
||
@level1type = N'TABLE', @level1name = N'user_refresh_tokens',
|
||
@level2type = N'COLUMN', @level2name = N'token_hash';
|
||
END
|
||
|
||
IF NOT EXISTS (
|
||
SELECT * FROM sys.extended_properties
|
||
WHERE major_id = OBJECT_ID('user_refresh_tokens')
|
||
AND minor_id = (SELECT column_id FROM sys.columns WHERE object_id = OBJECT_ID('user_refresh_tokens') AND name = 'expires_at')
|
||
AND name = 'MS_Description'
|
||
)
|
||
BEGIN
|
||
EXEC sp_addextendedproperty
|
||
@name = N'MS_Description',
|
||
@value = N'过期时间',
|
||
@level0type = N'SCHEMA', @level0name = N'dbo',
|
||
@level1type = N'TABLE', @level1name = N'user_refresh_tokens',
|
||
@level2type = N'COLUMN', @level2name = N'expires_at';
|
||
END
|
||
|
||
IF NOT EXISTS (
|
||
SELECT * FROM sys.extended_properties
|
||
WHERE major_id = OBJECT_ID('user_refresh_tokens')
|
||
AND minor_id = (SELECT column_id FROM sys.columns WHERE object_id = OBJECT_ID('user_refresh_tokens') AND name = 'created_at')
|
||
AND name = 'MS_Description'
|
||
)
|
||
BEGIN
|
||
EXEC sp_addextendedproperty
|
||
@name = N'MS_Description',
|
||
@value = N'创建时间',
|
||
@level0type = N'SCHEMA', @level0name = N'dbo',
|
||
@level1type = N'TABLE', @level1name = N'user_refresh_tokens',
|
||
@level2type = N'COLUMN', @level2name = N'created_at';
|
||
END
|
||
|
||
IF NOT EXISTS (
|
||
SELECT * FROM sys.extended_properties
|
||
WHERE major_id = OBJECT_ID('user_refresh_tokens')
|
||
AND minor_id = (SELECT column_id FROM sys.columns WHERE object_id = OBJECT_ID('user_refresh_tokens') AND name = 'created_by_ip')
|
||
AND name = 'MS_Description'
|
||
)
|
||
BEGIN
|
||
EXEC sp_addextendedproperty
|
||
@name = N'MS_Description',
|
||
@value = N'创建时的 IP 地址',
|
||
@level0type = N'SCHEMA', @level0name = N'dbo',
|
||
@level1type = N'TABLE', @level1name = N'user_refresh_tokens',
|
||
@level2type = N'COLUMN', @level2name = N'created_by_ip';
|
||
END
|
||
|
||
IF NOT EXISTS (
|
||
SELECT * FROM sys.extended_properties
|
||
WHERE major_id = OBJECT_ID('user_refresh_tokens')
|
||
AND minor_id = (SELECT column_id FROM sys.columns WHERE object_id = OBJECT_ID('user_refresh_tokens') AND name = 'revoked_at')
|
||
AND name = 'MS_Description'
|
||
)
|
||
BEGIN
|
||
EXEC sp_addextendedproperty
|
||
@name = N'MS_Description',
|
||
@value = N'撤销时间',
|
||
@level0type = N'SCHEMA', @level0name = N'dbo',
|
||
@level1type = N'TABLE', @level1name = N'user_refresh_tokens',
|
||
@level2type = N'COLUMN', @level2name = N'revoked_at';
|
||
END
|
||
|
||
IF NOT EXISTS (
|
||
SELECT * FROM sys.extended_properties
|
||
WHERE major_id = OBJECT_ID('user_refresh_tokens')
|
||
AND minor_id = (SELECT column_id FROM sys.columns WHERE object_id = OBJECT_ID('user_refresh_tokens') AND name = 'revoked_by_ip')
|
||
AND name = 'MS_Description'
|
||
)
|
||
BEGIN
|
||
EXEC sp_addextendedproperty
|
||
@name = N'MS_Description',
|
||
@value = N'撤销时的 IP 地址',
|
||
@level0type = N'SCHEMA', @level0name = N'dbo',
|
||
@level1type = N'TABLE', @level1name = N'user_refresh_tokens',
|
||
@level2type = N'COLUMN', @level2name = N'revoked_by_ip';
|
||
END
|
||
|
||
IF NOT EXISTS (
|
||
SELECT * FROM sys.extended_properties
|
||
WHERE major_id = OBJECT_ID('user_refresh_tokens')
|
||
AND minor_id = (SELECT column_id FROM sys.columns WHERE object_id = OBJECT_ID('user_refresh_tokens') AND name = 'replaced_by_token')
|
||
AND name = 'MS_Description'
|
||
)
|
||
BEGIN
|
||
EXEC sp_addextendedproperty
|
||
@name = N'MS_Description',
|
||
@value = N'被替换的新 Token 哈希值(用于 Token 轮换追踪)',
|
||
@level0type = N'SCHEMA', @level0name = N'dbo',
|
||
@level1type = N'TABLE', @level1name = N'user_refresh_tokens',
|
||
@level2type = N'COLUMN', @level2name = N'replaced_by_token';
|
||
END
|
||
END
|
||
GO
|
||
|
||
PRINT N'用户刷新令牌表迁移脚本执行完成';
|
||
GO
|