SET NOCOUNT ON; SET XACT_ABORT ON; BEGIN TRY BEGIN TRANSACTION; IF OBJECT_ID(N'dbo.b_module', N'U') IS NULL BEGIN CREATE TABLE dbo.b_module ( b_id varchar(50) NOT NULL, b_parent_id varchar(50) NULL, b_name nvarchar(100) NOT NULL, b_i18n varchar(150) NULL, b_type varchar(20) NOT NULL, b_route varchar(200) NULL, b_viewtable varchar(128) NULL, b_savetable varchar(128) NULL, b_keyfield varchar(50) NULL, b_orderfield varchar(50) NULL, b_ordertype varchar(4) NULL, b_canmenu int NOT NULL CONSTRAINT DF_b_module_canmenu DEFAULT (0), b_canuse int NOT NULL CONSTRAINT DF_b_module_canuse DEFAULT (1), b_xh int NOT NULL CONSTRAINT DF_b_module_xh DEFAULT (0), CONSTRAINT PK_b_module PRIMARY KEY (b_id), CONSTRAINT FK_b_module_parent FOREIGN KEY (b_parent_id) REFERENCES dbo.b_module (b_id), CONSTRAINT CK_b_module_id CHECK ( LEN(b_id) BETWEEN 2 AND 50 AND b_id LIKE '[A-Z]%' AND b_id NOT LIKE '%[^A-Z0-9_]%' ), CONSTRAINT CK_b_module_type CHECK (b_type IN ('directory', 'page', 'data')), CONSTRAINT CK_b_module_ordertype CHECK (b_ordertype IS NULL OR b_ordertype IN ('ASC', 'DESC')), CONSTRAINT CK_b_module_canmenu CHECK (b_canmenu IN (0, 1)), CONSTRAINT CK_b_module_canuse CHECK (b_canuse IN (0, 1)), CONSTRAINT CK_b_module_directory CHECK ( b_type <> 'directory' OR (b_route IS NULL AND b_viewtable IS NULL AND b_savetable IS NULL) ), CONSTRAINT CK_b_module_data CHECK (b_type <> 'data' OR b_canmenu = 0) ); END; IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE object_id = OBJECT_ID(N'dbo.b_module') AND name = N'UX_b_module_route') CREATE UNIQUE INDEX UX_b_module_route ON dbo.b_module (b_route) WHERE b_route IS NOT NULL AND b_route <> ''; IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE object_id = OBJECT_ID(N'dbo.b_module') AND name = N'IX_b_module_parent') CREATE INDEX IX_b_module_parent ON dbo.b_module (b_parent_id, b_xh, b_id); IF OBJECT_ID(N'dbo.b_module_field', N'U') IS NULL BEGIN CREATE TABLE dbo.b_module_field ( b_id bigint NOT NULL, b_module_id varchar(50) NOT NULL, b_field varchar(50) NOT NULL, b_name nvarchar(100) NOT NULL, b_i18n varchar(150) NULL, b_type varchar(20) NOT NULL, b_canlist int NOT NULL CONSTRAINT DF_b_module_field_canlist DEFAULT (1), b_canform int NOT NULL CONSTRAINT DF_b_module_field_canform DEFAULT (1), b_must int NOT NULL CONSTRAINT DF_b_module_field_must DEFAULT (0), b_canquery int NOT NULL CONSTRAINT DF_b_module_field_canquery DEFAULT (0), b_readonly int NOT NULL CONSTRAINT DF_b_module_field_readonly DEFAULT (0), b_width int NULL, b_value nvarchar(500) NULL, b_xh int NOT NULL CONSTRAINT DF_b_module_field_xh DEFAULT (0), b_canuse int NOT NULL CONSTRAINT DF_b_module_field_canuse DEFAULT (1), CONSTRAINT PK_b_module_field PRIMARY KEY (b_id), CONSTRAINT FK_b_module_field_module FOREIGN KEY (b_module_id) REFERENCES dbo.b_module (b_id), CONSTRAINT UQ_b_module_field UNIQUE (b_module_id, b_field), CONSTRAINT CK_b_module_field_type CHECK (b_type IN ('string', 'text', 'number', 'select', 'date', 'boolean')), CONSTRAINT CK_b_module_field_canlist CHECK (b_canlist IN (0, 1)), CONSTRAINT CK_b_module_field_canform CHECK (b_canform IN (0, 1)), CONSTRAINT CK_b_module_field_must CHECK (b_must IN (0, 1)), CONSTRAINT CK_b_module_field_canquery CHECK (b_canquery IN (0, 1)), CONSTRAINT CK_b_module_field_readonly CHECK (b_readonly IN (0, 1)), CONSTRAINT CK_b_module_field_canuse CHECK (b_canuse IN (0, 1)), CONSTRAINT CK_b_module_field_form_must CHECK (b_canform = 1 OR b_must = 0), CONSTRAINT CK_b_module_field_width CHECK (b_width IS NULL OR b_width > 0) ); END; IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE object_id = OBJECT_ID(N'dbo.b_module_field') AND name = N'IX_b_module_field_module') CREATE INDEX IX_b_module_field_module ON dbo.b_module_field (b_module_id, b_xh, b_id); IF OBJECT_ID(N'dbo.b_module_power', N'U') IS NULL BEGIN CREATE TABLE dbo.b_module_power ( b_id bigint NOT NULL, b_module_id varchar(50) NOT NULL, b_code varchar(50) NOT NULL, b_name nvarchar(100) NOT NULL, b_i18n varchar(150) NULL, b_xh int NOT NULL CONSTRAINT DF_b_module_power_xh DEFAULT (0), b_canuse int NOT NULL CONSTRAINT DF_b_module_power_canuse DEFAULT (1), CONSTRAINT PK_b_module_power PRIMARY KEY (b_id), CONSTRAINT FK_b_module_power_module FOREIGN KEY (b_module_id) REFERENCES dbo.b_module (b_id), CONSTRAINT UQ_b_module_power UNIQUE (b_module_id, b_code), CONSTRAINT CK_b_module_power_canuse CHECK (b_canuse IN (0, 1)) ); END; IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE object_id = OBJECT_ID(N'dbo.b_module_power') AND name = N'IX_b_module_power_module') CREATE INDEX IX_b_module_power_module ON dbo.b_module_power (b_module_id, b_xh, b_id); IF OBJECT_ID(N'dbo.b_user_module', N'U') IS NULL BEGIN CREATE TABLE dbo.b_user_module ( b_id bigint NOT NULL, b_user_id bigint NOT NULL, b_module_id varchar(50) NOT NULL, b_inputuser_id bigint NOT NULL, b_inputdatetime datetime NOT NULL CONSTRAINT DF_b_user_module_inputdatetime DEFAULT (GETDATE()), CONSTRAINT PK_b_user_module PRIMARY KEY (b_id), CONSTRAINT FK_b_user_module_user FOREIGN KEY (b_user_id) REFERENCES dbo.b_user (b_id), CONSTRAINT FK_b_user_module_module FOREIGN KEY (b_module_id) REFERENCES dbo.b_module (b_id), CONSTRAINT FK_b_user_module_inputuser FOREIGN KEY (b_inputuser_id) REFERENCES dbo.b_user (b_id), CONSTRAINT UQ_b_user_module UNIQUE (b_user_id, b_module_id) ); END; IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE object_id = OBJECT_ID(N'dbo.b_user_module') AND name = N'IX_b_user_module_module') CREATE INDEX IX_b_user_module_module ON dbo.b_user_module (b_module_id, b_user_id); IF OBJECT_ID(N'dbo.b_user_power', N'U') IS NULL BEGIN CREATE TABLE dbo.b_user_power ( b_id bigint NOT NULL, b_user_id bigint NOT NULL, b_power_id bigint NOT NULL, b_inputuser_id bigint NOT NULL, b_inputdatetime datetime NOT NULL CONSTRAINT DF_b_user_power_inputdatetime DEFAULT (GETDATE()), CONSTRAINT PK_b_user_power PRIMARY KEY (b_id), CONSTRAINT FK_b_user_power_user FOREIGN KEY (b_user_id) REFERENCES dbo.b_user (b_id), CONSTRAINT FK_b_user_power_power FOREIGN KEY (b_power_id) REFERENCES dbo.b_module_power (b_id), CONSTRAINT FK_b_user_power_inputuser FOREIGN KEY (b_inputuser_id) REFERENCES dbo.b_user (b_id), CONSTRAINT UQ_b_user_power UNIQUE (b_user_id, b_power_id) ); END; IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE object_id = OBJECT_ID(N'dbo.b_user_power') AND name = N'IX_b_user_power_power') CREATE INDEX IX_b_user_power_power ON dbo.b_user_power (b_power_id, b_user_id); IF OBJECT_ID(N'dbo.b_i18n', N'U') IS NULL BEGIN CREATE TABLE dbo.b_i18n ( b_id bigint NOT NULL, b_key varchar(150) NOT NULL, b_locale varchar(20) NOT NULL, b_value nvarchar(500) NOT NULL, b_inputuser_id bigint NOT NULL, b_inputdatetime datetime NOT NULL CONSTRAINT DF_b_i18n_inputdatetime DEFAULT (GETDATE()), b_updateuser_id bigint NULL, b_updatedatetime datetime NULL, CONSTRAINT PK_b_i18n PRIMARY KEY (b_id), CONSTRAINT FK_b_i18n_inputuser FOREIGN KEY (b_inputuser_id) REFERENCES dbo.b_user (b_id), CONSTRAINT FK_b_i18n_updateuser FOREIGN KEY (b_updateuser_id) REFERENCES dbo.b_user (b_id), CONSTRAINT UQ_b_i18n UNIQUE (b_key, b_locale) ); END; IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE object_id = OBJECT_ID(N'dbo.b_i18n') AND name = N'IX_b_i18n_key') CREATE INDEX IX_b_i18n_key ON dbo.b_i18n (b_key, b_locale); IF NOT EXISTS (SELECT 1 FROM dbo.b_module WHERE b_id = 'M_SYSTEM') INSERT INTO dbo.b_module (b_id, b_parent_id, b_name, b_i18n, b_type, b_canmenu, b_canuse, b_xh) VALUES ('M_SYSTEM', NULL, N'系统管理', 'module.M_SYSTEM', 'directory', 1, 1, 100); IF NOT EXISTS (SELECT 1 FROM dbo.b_module WHERE b_id = 'M_MODULE') INSERT INTO dbo.b_module (b_id, b_parent_id, b_name, b_i18n, b_type, b_route, b_canmenu, b_canuse, b_xh) VALUES ('M_MODULE', 'M_SYSTEM', N'模块管理', 'module.M_MODULE', 'page', '/system/modules', 1, 1, 10); DECLARE @Powers TABLE (b_id bigint, b_code varchar(50), b_name nvarchar(100), b_xh int); INSERT INTO @Powers VALUES (205000000000000001, 'create', N'新增', 10), (205000000000000002, 'update', N'修改', 20), (205000000000000003, 'delete', N'删除', 30), (205000000000000004, 'grant', N'用户授权', 40); INSERT INTO dbo.b_module_power (b_id, b_module_id, b_code, b_name, b_i18n, b_xh, b_canuse) SELECT p.b_id, 'M_MODULE', p.b_code, p.b_name, 'power.M_MODULE.' + p.b_code, p.b_xh, 1 FROM @Powers p WHERE NOT EXISTS ( SELECT 1 FROM dbo.b_module_power target WHERE target.b_module_id = 'M_MODULE' AND target.b_code = p.b_code ); EXEC sys.sp_set_session_context @key = N'allow_g3soft', @value = 1; DECLARE @AdminId bigint = (SELECT TOP (1) b_id FROM dbo.b_user WHERE b_account = N'g3soft' AND b_canuse = 1); IF @AdminId IS NULL THROW 51000, '未找到已启用的管理员账号 g3soft,模块管理初始化已取消。', 1; IF NOT EXISTS (SELECT 1 FROM dbo.b_user_module WHERE b_user_id = @AdminId AND b_module_id = 'M_MODULE') INSERT INTO dbo.b_user_module (b_id, b_user_id, b_module_id, b_inputuser_id, b_inputdatetime) VALUES (205000000000000101, @AdminId, 'M_MODULE', @AdminId, GETDATE()); INSERT INTO dbo.b_user_power (b_id, b_user_id, b_power_id, b_inputuser_id, b_inputdatetime) SELECT 205000000000000200 + ROW_NUMBER() OVER (ORDER BY p.b_id), @AdminId, p.b_id, @AdminId, GETDATE() FROM dbo.b_module_power p WHERE p.b_module_id = 'M_MODULE' AND p.b_code IN ('create', 'update', 'delete', 'grant') AND NOT EXISTS ( SELECT 1 FROM dbo.b_user_power target WHERE target.b_user_id = @AdminId AND target.b_power_id = p.b_id ); EXEC sys.sp_set_session_context @key = N'allow_g3soft', @value = NULL; COMMIT TRANSACTION; END TRY BEGIN CATCH IF XACT_STATE() <> 0 ROLLBACK TRANSACTION; BEGIN TRY EXEC sys.sp_set_session_context @key = N'allow_g3soft', @value = NULL; END TRY BEGIN CATCH END CATCH; THROW; END CATCH;