触发器实现记录操作表的日志
这个功能我是琢磨了好久,本来我的sqlserver方面的知识深入了解的就不多,关键的难点是用变量代替字段名,然后获取字段在表中存的值,再赋给另外一个变量,我之所以这么做,因为后面好几处要用到这个字段的名称,我才用变量代替,便于修改,可就是 实现 花费
这个功能我是琢磨了好久,本来我的sqlserver方面的知识深入了解的就不多,关键的难点是用变量代替字段名,然后获取字段在表中存的值,再赋给另外一个变量,我之所以这么做,因为后面好几处要用到这个字段的名称,我才用变量代替,便于修改,可就是实现花费了很长时间,网上这么方面的资料又少,可终究还是找到了解决方案,希望大家以后遇到同样的问题不至于头大,把具体的实现分享给大家
CREATE trigger [dbo].[trg_new_course]
on [dbo].[course]
for insert,delete,update
as
begin
declare @tabname varchar(50),
@pkname varchar(20),
@pkvalue varchar(20),
@opttype int,
@optip varchar(20),
@optsql varchar(200),
@xmlstr nvarchar(500);
declare @optinfo nvarchar(500), @id_i int, @id_d int;
declare @min_id int, --最小的字段号
@total int, --记录总数
@row_count int, --循环变量
@temp_name varchar(100), --临时字段名
@temp_pre_name varchar(100), --带字段类型前缀的变量
@temp_type varchar(100), --临时字段类型
@temp_value varchar(100), --临时字段值
@xmlnode_value varchar(100), --xml的节点值
@sql_name varchar(100), --sql操作相关的字段
@sql_value varchar(100), --sql操作相关的字段值
@sql nvarchar(200), --存储动态
sql @pk_pre_name varchar(20) --带类型前缀的关键字段名
set @sql_name = '';
set @sql_value = '';
set @row_count = 1;
set @pkname = 'id'; --关键字名称
set @tabname = 'course'; --操作的表名
set @optinfo = '';
select @id_i=id from inserted; select @id_d=id from deleted;
select @temp_type = data_type from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = @tabname and column_name = @pkname;
if (@temp_type = 'int')
begin
set @pk_pre_name = 'i' + @pkname
end
else if(@temp_type = 'float')
begin
set @pk_pre_name = 'f' + @pkname
end
else if(@temp_type = 'decimal')
begin
set @pk_pre_name = 'd' + @pkname
end
else if(@temp_type = 'datetime')
begin
set @pk_pre_name = 'da' + @pkname
end
else
begin
set @pk_pre_name = 'c' + @pkname
end
if @id_i is null and @id_d is not null --删除操作
begin
set @pkvalue = @id_d;
set @opttype = 1;
--若变量的类型不是字符串型
set @pkvalue = convert(varchar(200),@pkvalue);
--生成执行删除操作的sql语句
set @optsql = 'delete from ' + @tabname + ' where ' + @pkname + '=' + @pkvalue;
--生成删除操作字段信息的xml表示
set @optinfo = @optinfo + '';
set @optinfo = @optinfo + @pkvalue;
set @optinfo = @optinfo + '' + @pkname +'>';
end
else
begin
set @pkvalue = @id_i;
select * into temps from inserted;--这句必须写动态sql中时找不到inerted这个逻辑表的
select @min_id = max(ordinal_position) from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = @tabname;
select @total = count(1) from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = @tabname;
while(@row_count
begin
select @temp_name = column_name,@temp_type = data_type from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = @tabname and ordinal_position = @min_id;
if(@temp_type = 'int')
begin
declare @temp_in int;
SET @sql = 'select @temp_in = ' + @temp_name + ' from temps;';
EXEC SP_EXECUTESQL @Sql, N'@temp_in int OUTPUT', @temp_in OUTPUT;
set @xmlnode_value = convert(varchar(100),@temp_in);
set @temp_value = @xmlnode_value;
set @temp_pre_name = 'i' + @temp_name;
end
else if(@temp_type = 'float')
begin
declare @temp_inf float;
SET @sql = 'select @temp_inf = ' + @temp_name + ' from temps;';
EXEC SP_EXECUTESQL @Sql, N'@temp_inf float OUTPUT', @temp_inf OUTPUT;
set @xmlnode_value = convert(varchar(100),@temp_inf);
set @temp_value = @xmlnode_value;
set @temp_pre_name = 'f' + @temp_name;
end
else if(@temp_type = 'decimal')
begin
declare @temp_ind float;
SET @sql = 'select @temp_ind = ' + @temp_name + ' from temps;';
EXEC SP_EXECUTESQL @Sql, N'@temp_ind decimal(18,0) OUTPUT', @temp_ind OUTPUT;
set @xmlnode_value = convert(varchar(100),@temp_ind);
set @temp_value = @xmlnode_value;
set @temp_pre_name = 'd' + @temp_name;
end
else
begin
declare @temp_inc varchar(200);
SET @sql = 'select @temp_inc = ' + @temp_name + ' from temps;';
EXEC SP_EXECUTESQL @Sql, N'@temp_inc varchar(200) OUTPUT', @temp_inc OUTPUT;
set @xmlnode_value = convert(varchar(100),@temp_inc);
set @temp_value = '''' + @xmlnode_value + '''';
set @temp_pre_name = 'c' + @temp_name;
end
--生成插入/修改操作相关数据信息的xml表示
set @optinfo = @optinfo + '';
set @optinfo = @optinfo + @xmlnode_value;
set @optinfo = @optinfo + '' + @temp_pre_name + '>';
if @id_i is not null and @id_d is null -- 插入操作
begin
--生成插入操作执行的sql语句
if(@temp_name @pkname)
begin
set @sql_name = @sql_name + ',' + @temp_name;
set @sql_value = @sql_value + ',' + @temp_value;
end
end
else if @id_i is not null and @id_d is not null --更新操作
begin
--生成修改操作执行的sql语句
if(@temp_name @pkname)
begin
set @sql_name = @sql_name + ',' + @temp_name + '=' + @temp_value;
end
end
select @min_id = ordinal_position from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = 'course' and ordinal_position
set @row_count = @row_count + 1;
end
if @id_i is not null and @id_d is null -- 插入操作
begin
--生成执行插入操作的sql语句
set @opttype = 0;
set @optsql = 'insert into ' + @tabname + '(' + substring(@sql_name,2,len(@sql_name)) + ')' + ' values(' + substring(@sql_value,2,len (@sql_value)) +')';
end
else if @id_i is not null and @id_d is not null --更新操作
begin
--生成执行修改操作的sql语句
set @opttype = 3;
set @optsql = 'update ' + @tabname + ' set ' + substring(@sql_name,2,len(@sql_name)) + ' where ' + @pkname + '=' + @pkvalue;
end
drop table temps;
end
set @xmlstr = '
set @xmlstr = @xmlstr + '
set @xmlstr = @xmlstr + '
set @xmlstr = @xmlstr + '
set @xmlstr = @xmlstr + ''; set @xmlstr = @xmlstr + '
set @xmlstr = @xmlstr + @optinfo;
set @xmlstr = @xmlstr + '';
set @xmlstr = @xmlstr + '';
select @optip=client_net_address from sys.dm_exec_connections where Session_id=@@spid;
if(@pkvalue is null)
begin
set @pkvalue = -1;
end
insert into optlog values(@tabname,@pkname,@pkvalue,@opttype,@optip,getdate(),@optsql,@xmlstr);
print '操作执行成功';
end
红色标注的部分我认识是实现的难点,就是用到了sqlserver的系统存储过程sp_executesql,具体的用法网上有的可以查下,这只是我的一家之言,或许大家还有很好的实现,欢迎大家提意见啊!我知道这里很多大牛,可能我的想法会比较拙劣,但希望能够帮助到大家,只此记录我的技术成长历程。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









vivox100s と x100 携帯電話はどちらも vivo の携帯電話製品ラインの代表的なモデルであり、それぞれ異なる時代における vivo のハイエンド技術レベルを代表するものであるため、2 つの携帯電話にはデザイン、性能、機能に一定の違いがあります。この記事では、消費者が自分に合った携帯電話をより適切に選択できるように、これら 2 つの携帯電話を性能比較と機能分析の観点から詳しく比較します。まずはvivox100sとx100の性能比較を見てみましょう。 vivox100s には最新の機能が搭載されています。

Huawei 携帯電話にデュアル WeChat ログインを実装するにはどうすればよいですか?ソーシャルメディアの台頭により、WeChatは人々の日常生活に欠かせないコミュニケーションツールの1つになりました。ただし、多くの人は、同じ携帯電話で同時に複数の WeChat アカウントにログインするという問題に遭遇する可能性があります。 Huawei 社の携帯電話ユーザーにとって、WeChat の二重ログインを実現することは難しくありませんが、この記事では Huawei 社の携帯電話で WeChat の二重ログインを実現する方法を紹介します。まず第一に、ファーウェイの携帯電話に付属するEMUIシステムは、デュアルアプリケーションを開くという非常に便利な機能を提供します。アプリケーションのデュアルオープン機能により、ユーザーは同時に

インターネットの急速な発展に伴い、セルフメディアという概念が人々の心に深く根付いてきました。では、セルフメディアとは一体何でしょうか?その主な特徴と機能は何ですか?次に、これらの問題を 1 つずつ検討していきます。 1. セルフメディアとは何ですか? We-media は、その名前が示すように、あなたがメディアであることを意味します。これは、個人またはチームがインターネット プラットフォームを通じてコンテンツを独自に作成、編集、公開、配布できる情報媒体を指します。新聞、テレビ、ラジオなどの従来のメディアとは異なり、セルフメディアはよりインタラクティブでパーソナライズされており、誰もが情報の制作者および発信者になることができます。 2. セルフメディアの主な特徴と機能は何ですか? 1. 敷居が低い: セルフメディアの台頭により、メディア業界への参入の敷居が低くなり、煩わしい機材や専門チームは必要なくなりました。

プログラミング言語 PHP は、さまざまなプログラミング ロジックやアルゴリズムをサポートできる、Web 開発用の強力なツールです。その中でも、フィボナッチ数列の実装は、一般的で古典的なプログラミングの問題です。この記事では、PHP プログラミング言語を使用してフィボナッチ数列を実装する方法を、具体的なコード例を添付して紹介します。フィボナッチ数列は、次のように定義される数学的数列です。数列の最初と 2 番目の要素は 1 で、3 番目の要素以降、各要素の値は前の 2 つの要素の合計に等しくなります。シーケンスの最初のいくつかの要素

小紅書が若者の間で人気になるにつれ、ますます多くの人がこのプラットフォームを使用して、自分の経験や人生の洞察のさまざまな側面を共有し始めています。複数の小紅書アカウントを効果的に管理する方法が重要な問題となっています。この記事では、Xiaohongshu アカウント管理ソフトウェアの機能のいくつかについて説明し、Xiaohongshu アカウントをより適切に管理する方法を探ります。ソーシャルメディアが成長するにつれて、多くの人が複数のソーシャルアカウントを管理する必要があることに気づきます。これは小紅書ユーザーにとっても課題です。小紅書アカウント管理ソフトウェアの中には、コンテンツの自動公開、スケジュールされた公開、データ分析、その他の機能など、ユーザーが複数のアカウントをより簡単に管理できるようにするものがあります。これらのツールを通じて、ユーザーはアカウントをより効率的に管理し、アカウントの露出と注目を高めることができます。さらに、Xiaohongshu アカウント管理ソフトウェアには、

Huawei 携帯電話に WeChat クローン機能を実装する方法 ソーシャル ソフトウェアの人気と人々のプライバシーとセキュリティの重視に伴い、WeChat クローン機能は徐々に人々の注目を集めるようになりました。 WeChat クローン機能を使用すると、ユーザーは同じ携帯電話で複数の WeChat アカウントに同時にログインできるため、管理と使用が容易になります。 Huawei携帯電話にWeChatクローン機能を実装するのは難しくなく、次の手順に従うだけです。ステップ 1: 携帯電話システムのバージョンと WeChat のバージョンが要件を満たしていることを確認する まず、Huawei 携帯電話システムのバージョンと WeChat アプリが最新バージョンに更新されていることを確認します。

今日のソフトウェア開発分野では、効率的で簡潔かつ同時実行性の高いプログラミング言語として、Golang (Go 言語) が開発者にますます好まれています。豊富な標準ライブラリと効率的な同時実行機能により、ゲーム開発の分野で注目を集めています。この記事では、ゲーム開発に Golang を使用する方法を検討し、具体的なコード例を通じてその強力な可能性を示します。 1. ゲーム開発における Golang の利点 Golang は静的型付け言語として、大規模なゲーム システムの構築に使用されます。

PHP は、Web 開発で広く使用されているサーバー側スクリプト言語です。その主な機能は、動的な Web コンテンツを生成することです。HTML と組み合わせると、リッチでカラフルな Web ページを作成できます。 PHP は強力で、さまざまなデータベース操作、ファイル操作、フォーム処理、その他のタスクを実行でき、Web サイトに強力な対話性と機能を提供します。次の記事では、詳細なコード例を使用して、PHP の役割と機能をさらに詳しく説明します。まず、PHP の一般的な使用法である動的な Web ページの生成を見てみましょう: P
