using Learun.DataBase.Repository; using Learun.Util; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; namespace Learun.Application.Base.SystemModule { /// /// 版 本 Learun-ADMS-Ultimate V7.0.0 数字化智慧校园 /// Copyright (c) 2013-2018 北京泉江科技有限公司 /// 创 建:超级管理员 /// 日 期:2017-12-19 12:03 /// 描 述:系统数据初始化 /// public class DatabaseInitService : RepositoryFactory { /// /// 系统数据初始化 /// /// public void InitDatabase() { try { //备份数据库;清除系统所有业务数据,只保留system账号,admin账号、角色数据等信息; //文件存放路径格式:/Resource/DataBaseBackup/{date}/{file}_{time}.{后缀名} var pathoffirst = Config.GetValue("dbbackuppath"); string pathofdate = DateTime.Now.ToString("yyyyMMdd"); string pathoftime = DateTime.Now.ToString("HHmmss") + CommonHelper.RndNum(6); string FileEextension = ".bak"; var databaseName1 = this.BaseRepository("BaseDb").getDbConnection().Database; var databaseName2 = this.BaseRepository("CollegeMIS").getDbConnection().Database; var directoryPath = $"{pathoffirst}/{pathofdate}"; var filePath1 = $"{pathoffirst}/{pathofdate}/{databaseName1 + "_" + pathoftime}{FileEextension}"; var filePath2 = $"{pathoffirst}/{pathofdate}/{databaseName2 + "_" + pathoftime}{FileEextension}"; //创建文件夹 if (!Directory.Exists(directoryPath)) { Directory.CreateDirectory(directoryPath); } //备份数据库 string backupSql1 = "backup database " + databaseName1 + " to disk='" + filePath1 + "' with format;"; this.BaseRepository("BaseDb").ExecuteAsyncBySql(backupSql1); string backupSql2 = "backup database " + databaseName2 + " to disk='" + filePath2 + "' with format;"; this.BaseRepository("CollegeMIS").ExecuteAsyncBySql(backupSql2); //清除触发器 if (true) { var strSql1 = new StringBuilder(); strSql1.Append(@"select a.name,a.id,a.xtype,a.parent_obj,b.name as pname,b.id as pid,b.xtype as pxtype,b.type as ptype, 'drop trigger ' + a.name + ';' as sql from sysobjects a left join sysobjects b on a.parent_obj = b.id where a.xtype = 'TR' and b.name not like '%sys%' and b.name not like '%dt%' order by b.name ; "); //adms7ultimate2表 var sqlList = this.BaseRepository().FindList(strSql1.ToString()).Select(x=>x.sql); //清除 if (sqlList.Any()) { foreach (var item in sqlList) { this.BaseRepository().ExecuteBySql(item); } } //CollegeMIS表 var sqlList2 = this.BaseRepository("CollegeMIS").FindList(strSql1.ToString()).Select(x => x.sql); //清除 if (sqlList2.Any()) { foreach (var item in sqlList2) { this.BaseRepository("CollegeMIS").ExecuteBySql(item); } } } //清除约束 if (true) { var strSql1 = new StringBuilder(); strSql1.Append(@"select a.name,a.id,a.xtype,a.parent_obj,b.name as pname,b.id as pid,b.xtype as pxtype,b.type as ptype, 'alter table '+b.name+' drop constraint '+a.name+';' as sql from sysobjects a left join sysobjects b on a.parent_obj=b.id where a.xtype in ('F','C','D','UQ') and b.name not like '%sys%' and b.name not like '%dt%' order by b.name ;"); //adms7ultimate2表 var sqlList = this.BaseRepository().FindList(strSql1.ToString()).Select(x => x.sql); //清除 if (sqlList.Any()) { foreach (var item in sqlList) { this.BaseRepository().ExecuteBySql(item); } } //CollegeMIS表 var sqlList2 = this.BaseRepository("CollegeMIS").FindList(strSql1.ToString()).Select(x => x.sql); //清除 if (sqlList2.Any()) { foreach (var item in sqlList2) { this.BaseRepository("CollegeMIS").ExecuteBySql(item); } } } //清除业务数据(当表有触发器和约束时,会执行异常!错误信息为:“子查询返回的值不止一个。当子查询跟随在 =、!=、<、<=、>、>= 之后,或子查询用作表达式时,这种情况是不允许的。”) if (true) { var strSql1 = new StringBuilder(); strSql1.Append("declare @trun_name varchar(50) "); strSql1.Append("declare name_cursor cursor for "); strSql1.Append("select 'truncate table ' + name+';' from sysobjects where xtype='U' and name <> 'LR_Base_User' and name <> 'LR_Base_Role' and name<>'LR_App_Function' and name<>'LR_Base_Authorize' and name<>'LR_Base_DatabaseLink' "); strSql1.Append(" and name<>'LR_Base_DataCondition' and name<>'LR_Base_DataItem' and name<>'LR_Base_DataItemDetail' and name<>'LR_Base_DataRelation' and name<>'LR_Base_DataSource' and name<>'LR_Base_Area' "); strSql1.Append(" and name<>'LR_Base_DbField' and name<>'LR_Base_Interface' and name<>'LR_Base_Logo' and name<>'LR_Base_Module' and name<>'LR_Base_ModuleButton' and name<>'LR_Base_ModuleColumn' "); strSql1.Append(" and name<>'LR_Base_ModuleForm' and name<>'LR_Base_UserRelation' and name<>'LR_DT_Chart' and name<>'LR_DT_List' and name<>'LR_DT_Target' and name<>'LR_Excel_Export' and name<>'LR_Excel_Import' "); strSql1.Append(" and name<>'LR_Excel_ImportFileds' and name<>'LR_Form_Relation' and name<>'LR_Form_Scheme' and name<>'LR_Form_SchemeInfo' and name<>'LR_Lg_Map' and name<>'LR_Lg_Type' and name<>'LR_NWF_Scheme' "); strSql1.Append(" and name<>'LR_NWF_SchemeAuth' and name<>'LR_NWF_SchemeInfo' and name <>'LR_Base_ThematicManagement' and name <>'LoginModel' and name <>'LR_MS_StrategyInfo' and name <>'Sys_QRCodeInLogin' and name <>'Sys_UpdateRecord' and name <>'TeachSwitch'"); strSql1.Append("open name_cursor "); strSql1.Append("fetch next from name_cursor into @trun_name "); strSql1.Append("while @@FETCH_STATUS = 0 "); strSql1.Append("begin exec (@trun_name) fetch next from name_cursor into @trun_name end "); strSql1.Append("close name_cursor "); strSql1.Append("deallocate name_cursor "); this.BaseRepository().ExecuteBySql(strSql1.ToString()); var strSql2 = new StringBuilder(); strSql2.Append("delete from LR_Base_User where F_Account <> 'System' and F_Account <> 'admin';"); strSql2.Append("delete from LR_Base_Authorize where F_ObjectId <> 'd61e1853-cdee-4d49-a5e1-e230f1098e52';"); strSql2.Append("delete from LR_Base_UserRelation where F_UserId <> '9f1a9d12-f4c2-4c28-9c60-5491090084ed';"); this.BaseRepository().ExecuteBySql(strSql2.ToString()); } if (true) { var strSql1 = new StringBuilder(); strSql1.Append("declare @trun_name varchar(50) "); strSql1.Append("declare name_cursor cursor for "); strSql1.Append("select 'delete from ' + name+';' from sysobjects where xtype='U' and name<>'DIC_AREA' and name<>'DIC_CITY' and name<>'DIC_PROVINCE' and name<>'BCdNationality' and name<>'BCdFamilyOrigin' and name<>'BCdPartyFace' and name<>'BCdSubjectSpecies' and name<>'BCdForeignLanguage' and name<>'BCdTitleOfTechPost' and name<>'BCdDegree' and name<>'BCdCultureDegree' and name<>'BCdOverseasChinese' and name<>'BCdHealthStatus' and name<>'BCdAbnormityMoveReason' and name<>'BCdAbnormitySort' and name<>'BCdEncourgeLevel' and name<>'BCdEncourgeSort' and name<>'BCdMatriculateSort' and name<>'BCdPlanForm' and name<>'BCdPunish' and name<>'BCdTestMode' and name<>'BCdTestStuSort' "); strSql1.Append("open name_cursor "); strSql1.Append("fetch next from name_cursor into @trun_name "); strSql1.Append("while @@FETCH_STATUS = 0 "); strSql1.Append("begin exec (@trun_name) fetch next from name_cursor into @trun_name end "); strSql1.Append("close name_cursor "); strSql1.Append("deallocate name_cursor "); this.BaseRepository("CollegeMIS").ExecuteBySql(strSql1.ToString()); } } catch (Exception ex) { if (ex is ExceptionEx) { throw; } else { throw ExceptionEx.ThrowServiceException(ex); } } } /// /// 视图临时模型 /// public class SysobjectModel { /// /// 触发器、约束名称 /// public string name { get; set; } /// /// 触发器、约束id /// public string id { get; set; } /// /// 类型 /// public string xtype { get; set; } /// /// 触发器、约束所属表id /// public string parent_obj { get; set; } /// /// 触发器、约束所属表名 /// public string pname { get; set; } /// /// 表id /// public string pid { get; set; } /// /// 表类型 /// public string pxtype { get; set; } /// /// 表类型 /// public string ptype { get; set; } /// /// 删除语句 /// public string sql { get; set; } } } }