プロジェクト04(SQLサーバーは10日間のテーブル01を追加します)

バックグラウンド

每年12月,为线上数据库添加旬表(一般为每月3张,格式为tablenameby202112_1,tablenameby202112_2,tablenameby202112_3) 可根据需要更改。(其中包括表结构,索引,用户权限等)

前に書く
本次使用的是游标,因为使用频率为1年添加1次,频率不高。读者可以根据需要建立存储过程并建立计划任务,使其自动执行。

例子:
create procedure [dbo].[Create_points_table]    --存储过程里面放置游标
as
begin
您的游标内容(自定义哟)
end

月に3枚

#其中根据需要更改起止时间,本次为2021年每月
declare @tablename varchar(50)
declare @sql01 varchar(1000)
declare @sql02 varchar(1000)
declare @sql03 varchar(1000)
declare Create_points_table cursor  
		for select convert(varchar(6),dateadd(mm,number,'2021-01-01'),112) --每月3张旬表(通过varchar(6)控制输出的字符数202001)
					from master..spt_values with(nolock) 
					where type='P' and number>=0 
					and dateadd(mm,number,'2021-01-01')<'2022-01-01'

	open Create_points_table
	
		fetch next from Create_points_table into @tablename
	while(@@fetch_status=0)
		begin

		set @sql01 = 'CREATE TABLE [dbo].[t_web_log_'+@tablename+'_1](
				[id] bigint primary key not null,
				[method_name] varchar(100) NULL ,
				[request_url] varchar(255) NULL ,
				[request_ip] varchar(50) NULL ,
				[request_params] text NULL ,
				[response_data] text NULL ,
				[time_span] int NULL default 0 ,
				[create_time] datetime NOT NULL ,
				[result_success] bit NULL DEFAULT ((0)) ,
				); CREATE INDEX [time_index] ON [dbo].[t_web_log_'+@tablename+'_1]
([create_time] DESC);'
		set @sql02 = 'CREATE TABLE [dbo].[t_web_log_'+@tablename+'_2](
				[id] bigint primary key not null,
				[method_name] varchar(100) NULL ,
				[request_url] varchar(255) NULL ,
				[request_ip] varchar(50) NULL ,
				[request_params] text NULL ,
				[response_data] text NULL ,
				[time_span] int NULL default 0 ,
				[create_time] datetime NOT NULL ,
				[result_success] bit NULL DEFAULT ((0)) ,
				); CREATE INDEX [time_index] ON [dbo].[t_web_log_'+@tablename+'_2]
([create_time] DESC);'
		set @sql03 = 'CREATE TABLE [dbo].[t_web_log_'+@tablename+'_3](
				[id] bigint primary key not null,
				[method_name] varchar(100) NULL ,
				[request_url] varchar(255) NULL ,
				[request_ip] varchar(50) NULL ,
				[request_params] text NULL ,
				[response_data] text NULL ,
				[time_span] int NULL default 0 ,
				[create_time] datetime NOT NULL ,
				[result_success] bit NULL DEFAULT ((0)) ,
				); CREATE INDEX [time_index] ON [dbo].[t_web_log_'+@tablename+'_3]
([create_time] DESC);'

		execute(@sql01)
		execute(@sql02)
		execute(@sql03)
		fetch next from Create_points_table into @tablename
		
		end
	close Create_points_table    --关闭
	deallocate Create_points_table  --释放

結果
ここに画像の説明を挿入

月に1回

	declare @tablename varchar(50)
	declare @sql varchar(1000)
	declare Create_points_table cursor  
		for select convert(varchar(6),dateadd(mm,number,'2020-01-01'),112) --每月一账分表(通过varchar(6)控制输出的字符数202001)
					from master..spt_values with(nolock) 
					where type='P' and number>=0 
					and dateadd(mm,number,'2020-01-01')<'2021-01-01'

	open Create_points_table
	
		fetch next from Create_points_table into @tablename
	while(@@fetch_status=0)
		begin

		set @sql = 'CREATE TABLE [dbo].[t_web_log_'+@tablename+'](
				[id] bigint primary key not null,
				[method_name] varchar(100) NULL ,
				[request_url] varchar(255) NULL ,
				[request_ip] varchar(50) NULL ,
				[request_params] text NULL ,
				[response_data] text NULL ,
				[time_span] int NULL default 0 ,
				[create_time] datetime NOT NULL ,
				[result_success] bit NULL DEFAULT ((0)) ,
				); CREATE INDEX [time_index] ON [dbo].[t_web_log_'+@tablename+']
([create_time] DESC);'

		execute(@sql)
		fetch next from Create_points_table into @tablename
		
		end
	close Create_points_table    --关闭
	deallocate Create_points_table  --释放

結果
ここに画像の説明を挿入
每月3张的语句就是从每月一张的语句基础上更改的

1日1回

	declare @tablename varchar(50)
	declare @sql varchar(1000)
	declare Create_points_table cursor  
		for select convert(varchar(50),dateadd(day,n.number,'2021-01-01'),112)
					from master.dbo.spt_values  n 
					where n.type = 'p'
					and number < datediff(day,'2021-01-01','2022-01-01')

	open Create_points_table
	
		fetch next from Create_points_table into @tablename
	while(@@fetch_status=0)
		begin

		set @sql = 'CREATE TABLE [dbo].[t_web_log_'+@tablename+'](
				[id] bigint primary key not null,
				[method_name] varchar(100) NULL ,
				[request_url] varchar(255) NULL ,
				[request_ip] varchar(50) NULL ,
				[request_params] text NULL ,
				[response_data] text NULL ,
				[time_span] int NULL default 0 ,
				[create_time] datetime NOT NULL ,
				[result_success] bit NULL DEFAULT ((0)) ,
				); CREATE INDEX [time_index] ON [dbo].[t_web_log_'+@tablename+']
([create_time] DESC);'
		execute(@sql)
		fetch next from Create_points_table into @tablename
		
		end
	close Create_points_table    --关闭
	deallocate Create_points_table  --释放

結果
ここに画像の説明を挿入

すべてのテーブルを削除します

仅用于测试时,使用。在线上使用时,请注意游标中的过滤添加(选择性删除哟,name != 'sysdiagrams' )

declare @tablename varchar(50)
declare @sql varchar(1000)
declare cu_adcolumn cursor  for select name from sys.tables where name != 'sysdiagrams'

open cu_adcolumn
fetch next from cu_adcolumn into @tablename
while(@@fetch_status=0)
begin

set @sql = 'drop table ['+@tablename+']  '

execute(@sql)

fetch next from cu_adcolumn into @tablename
end
close cu_adcolumn    --关闭
deallocate cu_adcolumn  --释放

インデックスを追加

为以上添加的旬表添加索引
テーブルを右クリックします(テーブルスクリプトを作成するには、新しいクエリエディタウィンドウを作成します)只会显示表结构
したがって数据库、エクスポート(スクリプトの生成、詳細オプション、インデックスの選択、スキーマのみ)を使用してSQLファイルとしてエクスポートしてから、上記のテーブル作成ステートメントと次のインデックス作成ステートメント(個別に実行する必要があります)を使用する必要があります。

需要修改name LIKE 'Orderby2021%';和表名的变量ON ['+@tableName+'],索引的个数需要自定义

declare @tableName varchar(50)
declare @sql01 varchar(max)
declare @sql02 varchar(max)


declare mycur cursor for select name from dbo.sysobjects where type='U' AND name LIKE 'Orderby2021%';
OPEN mycur
	fetch next from mycur into @tableName
	while @@FETCH_STATUS=0
	begin	
		set @sql01='CREATE NONCLUSTERED INDEX [time_index] ON ['+@tableName+']
(
	[create_time] DESC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]';
		set @sql02='CREATE NONCLUSTERED INDEX [time_span_index] ON ['+@tableName+']
(
	[time_span] DESC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
';
		-- print @sql01
		-- print @sql02
		exec (@sql01)
		exec (@sql02)
			
		fetch next from mycur into @tableName
	end
close mycur
deallocate mycur

ユーザーテーブルの権限を追加する

使用时请按需修改
declare @tableName varchar(50)
declare @sql01 varchar(max)
declare @sql02 varchar(max)


declare mycur cursor for select name from dbo.sysobjects where type='U' AND name LIKE 'Orderby2021%';
OPEN mycur
	fetch next from mycur into @tableName
	while @@FETCH_STATUS=0
	begin	
		set @sql01='grant select,insert,delete,update on ['+ @tableName+'] to testuser01';
		set @sql02='grant select,insert,delete,update on ['+ @tableName+'] to sa2';
		-- print @sql01
		-- print @sql02
		exec (@sql01)
		exec (@sql02)
			
		fetch next from mycur into @tableName
	end
close mycur
deallocate mycur
go

ベーステーブル

(读者需要根据作业逻辑判断自己的环境) base表添加数据(数据为分表的后缀)(作用为引导外部数据写入分表,所以很重要),顺序为添加完对应旬表之后再添加

declare @tablename varchar(50)
declare @sql01 varchar(1000)
declare @sql02 varchar(1000)
declare @sql03 varchar(1000)
declare Create_points_table cursor
		for select convert(varchar(6),dateadd(mm,number,'2021-01-01'),112) --每月一账分表(通过varchar(6)控制输出的字符数202001)
				from master..spt_values with(nolock) 
				where type='P' and number>=0 
				and dateadd(mm,number,'2021-01-01')<'2022-01-01'

open Create_points_table
	fetch next from Create_points_table into @tablename
		while(@@fetch_status=0)
			begin

			set @sql01 ='INSERT INTO  [dbo].[base] (id) VALUES (''by'+@tablename+'_1'');'
			set @sql02 ='INSERT INTO  [dbo].[base] (id) VALUES (''by'+@tablename+'_2'');'
			set @sql03 ='INSERT INTO  [dbo].[base] (id) VALUES (''by'+@tablename+'_3'');'
			execute(@sql01)
			execute(@sql02)
			execute(@sql03)
	fetch next from Create_points_table into @tablename
		
			end
close Create_points_table    --关闭
deallocate Create_points_table  --释放

概要

センテンススプライシング用の時間関数+システムライブラリテーブル。その中で、master ... spt_values with(nolock)
where type = 'P'は最大数の2047に制限されてい
ますselect * from master ... spt_values where type = 'P' order by number desc In
otherつまり、10年のテーブルを追加する最大時間は約2047年にすることはできません。(つまり、上記のスクリプトは27年後に正常に実行できません)

之后为项目04(Mysql添加旬表02),使用游标还可以批量添加字段(写在其他篇幅)

この記事では、主な技術コンテンツは、インターネットテクノロジーの巨人の共有と、一部の自己処理(注釈の役割のみ)に由来することを説明しています。関連する質問がある場合は、確認後にメッセージを残してください。侵害の実装は削除されます

おすすめ

転載: blog.csdn.net/baidu_34007305/article/details/110873568