动态设置表结构方案

如果想提供平台功能,以适应不同业务,引入动态设置表结构功能,怎么办呢?

有一个方案是这样的:

1、按照用户的配置,建立相应的物理表

2、系统上线使用以后,有可能还会调整表结构(虽然几率不算太大,但毕竟是有这种可能)

3、这时,应该相应修改物理表结构

4、怎么调整呢?

1)按照新结构,建立一张新表

2)在当前表建立触发器,将当前表所有的增删改都同步到新表

3)复制数据到新表

4)通过换名,将新表置换当前表

假设当前表为 [bigtable],新表为[bigtable.tmp]

触发器:

[sql]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. ALTER TRIGGER [dbo].[trgIns]  
  2.    ON  [dbo].[bigtable]  
  3.    AFTER INSERT  
  4. AS   
  5. BEGIN  
  6.     -- SET NOCOUNT ON added to prevent extra result sets from  
  7.     -- interfering with SELECT statements.  
  8.     SET NOCOUNT ON;  
  9.   
  10.     -- Insert statements for trigger here  
  11.     -- 将新增纪录拷贝到临时表  
  12.     SELECT * INTO #inserted FROM INSERTED;  
  13.   
  14.     -- 获得当前表的字段  
  15.     DECLARE @cols VARCHAR(MAX) = '';  
  16.     SELECT  
  17.         @cols = @cols + ',' + C.name  
  18.     FROM sys.columns C  
  19.     WHERE C.[object_id] = OBJECT_ID('[bigtable]');  
  20.     SET @cols = SUBSTRING(@cols,2,LEN(@cols) - 1);  
  21.   
  22.     -- 显式插入标识列  
  23.     SET IDENTITY_INSERT [bigtable.tmp] ON;  
  24.       
  25.     -- 将增加记录从临时表拷贝至新表  
  26.     DECLARE @sql VARCHAR(MAX) = '';  
  27.     SET @sql = 'INSERT INTO [bigtable.tmp](' + @cols + ') SELECT ' + @cols + ' FROM #inserted';  
  28.     EXEC(@sql);  
  29.   
  30.     SET IDENTITY_INSERT [bigtable.tmp] OFF;  
  31. END  

网络限制,一片文章只能发这么多。。。,余下部分见动态设置表结构方案(二)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值