如果想提供平台功能,以适应不同业务,引入动态设置表结构功能,怎么办呢?
有一个方案是这样的:
1、按照用户的配置,建立相应的物理表
2、系统上线使用以后,有可能还会调整表结构(虽然几率不算太大,但毕竟是有这种可能)
3、这时,应该相应修改物理表结构
4、怎么调整呢?
1)按照新结构,建立一张新表
2)在当前表建立触发器,将当前表所有的增删改都同步到新表
3)复制数据到新表
4)通过换名,将新表置换当前表
假设当前表为 [bigtable],新表为[bigtable.tmp]
触发器:
- ALTER TRIGGER [dbo].[trgIns]
- ON [dbo].[bigtable]
- AFTER INSERT
- AS
- BEGIN
- -- SET NOCOUNT ON added to prevent extra result sets from
- -- interfering with SELECT statements.
- SET NOCOUNT ON;
- -- Insert statements for trigger here
- -- 将新增纪录拷贝到临时表
- SELECT * INTO #inserted FROM INSERTED;
- -- 获得当前表的字段
- DECLARE @cols VARCHAR(MAX) = '';
- SELECT
- @cols = @cols + ',' + C.name
- FROM sys.columns C
- WHERE C.[object_id] = OBJECT_ID('[bigtable]');
- SET @cols = SUBSTRING(@cols,2,LEN(@cols) - 1);
- -- 显式插入标识列
- SET IDENTITY_INSERT [bigtable.tmp] ON;
- -- 将增加记录从临时表拷贝至新表
- DECLARE @sql VARCHAR(MAX) = '';
- SET @sql = 'INSERT INTO [bigtable.tmp](' + @cols + ') SELECT ' + @cols + ' FROM #inserted';
- EXEC(@sql);
- SET IDENTITY_INSERT [bigtable.tmp] OFF;
- END
网络限制,一片文章只能发这么多。。。,余下部分见动态设置表结构方案(二)