数据库结构同步之通过DDL触发器记录数据库结构的变更
需求: 在开发多人协作的项目的时候,一般要同时使用多个数据库 常见的情况有: 一个开发者用的数据库(开发库), 一个测试者用的数据库(测试库), 一个正式开放给客户的数据库(正式库), 那么这三个数据库之间的数据结构的同步就将成为一个问题 如:当
需求:
在开发多人协作的项目的时候,一般要同时使用多个数据库
常见的情况有:
一个开发者用的数据库(开发库),
一个测试者用的数据库(测试库),
一个正式开放给客户的数据库(正式库),
那么这三个数据库之间的数据结构的同步就将成为一个问题
如:当开发者A在“开发库”中添加了一个表,开发者B修改了一个表...
这些数据库结构的变更势必要同步到“测试库”和“正式库”中去
但肉手记录数据库结构变更的方式即麻烦由容易出错...
如之奈何?
思考过程:
之前曾在数据库达人邹建那里看到一篇帖子(找不到了),
但试过之后发现,很多情况都会出异常...就放弃了
后来在WCF达人Artech这里看到一篇文章
追踪记录每笔业务操作数据改变的利器——SQLCDC
此文章是针对数据库表记录CURD操作的日志
并非表结构
后来我在文章评论中向Artech请教了我的问题,
得到了DDL Trigger的答案
记下来并分享
代码及解释:
USE MRLH_CM; GO --创建记录数据库结构变更的表 CREATE TABLE LogTable (DB_User nvarchar(200), EventType nvarchar(200), SQLString nvarchar(2000),ChangeTime datetime); GO CREATE TRIGGER LogTrigger ON DATABASE FOR DROP_TABLE, ALTER_TABLE ,CREATE_TABLE AS DECLARE @data XML SET @data = EVENTDATA() INSERT LogTable (DB_User, EventType, SQLString,ChangeTime) VALUES (CONVERT(nvarchar(100), CURRENT_USER), @data.value('(/EVENT_INSTANCE/EventType)[1]', 'nvarchar(100)'), @data.value('(/EVENT_INSTANCE/TSQLCommand)[1]', 'nvarchar(2000)'), GETDATE() ) ; GO
和普通的创建触发器的过程类似
就说其中的两个地方吧
1.FOR DROP_TABLE, ALTER_TABLE ,CREATE_TABLE
这里只记录了这几个事件
如果记录更多的事件请使用
FOR DDL_DATABASE_LEVEL_EVENTS
了解更多的事件情况请访问
http://msdn.microsoft.com/en-us/library/ms186456(SQL.90).aspx
2.SET @data = EVENTDATA()
EVENTDATA()是数据库自身的方法
返回有关服务器或数据库事件的信息(XML格式)
只有直接在 DDL 或登录触发器内部引用 EVENTDATA 时,EVENTDATA 才会返回数据。
如果 EVENTDATA 由其他例程调用(即使这些例程由 DDL 或登录触发器进行调用),将返回 NULL。
@data.value('(/EVENT_INSTANCE/EventType)[1]
这是使用XQUERY检索XML中的数据
详细的XQUERY教程请看这里
http://www.w3school.com.cn/xquery/index.asp
注意:
--想删除表LogTable必须先删除这个触发器 DROP TRIGGER LogTrigger on database GO --删除表 DROP TABLE LogTable GO
以上代码均在MSSQLSERVER2008下测试通过
其他数据库没有测试

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas











Keluaran terbaharu Apple bagi sistem iOS18, iPadOS18 dan macOS Sequoia telah menambah ciri penting pada aplikasi Photos, yang direka untuk membantu pengguna memulihkan foto dan video yang hilang atau rosak dengan mudah disebabkan pelbagai sebab. Ciri baharu ini memperkenalkan album yang dipanggil "Dipulihkan" dalam bahagian Alat pada apl Foto yang akan muncul secara automatik apabila pengguna mempunyai gambar atau video pada peranti mereka yang bukan sebahagian daripada pustaka foto mereka. Kemunculan album "Dipulihkan" menyediakan penyelesaian untuk foto dan video yang hilang akibat kerosakan pangkalan data, aplikasi kamera tidak disimpan ke pustaka foto dengan betul, atau aplikasi pihak ketiga yang menguruskan pustaka foto. Pengguna hanya memerlukan beberapa langkah mudah

Cara menggunakan MySQLi untuk mewujudkan sambungan pangkalan data dalam PHP: Sertakan sambungan MySQLi (require_once) Cipta fungsi sambungan (functionconnect_to_db) Fungsi sambungan panggilan ($conn=connect_to_db()) Laksanakan pertanyaan ($result=$conn->query()) Tutup sambungan ( $conn->close())

Untuk mengendalikan ralat sambungan pangkalan data dalam PHP, anda boleh menggunakan langkah berikut: Gunakan mysqli_connect_errno() untuk mendapatkan kod ralat. Gunakan mysqli_connect_error() untuk mendapatkan mesej ralat. Dengan menangkap dan mengelog mesej ralat ini, isu sambungan pangkalan data boleh dikenal pasti dan diselesaikan dengan mudah, memastikan kelancaran aplikasi anda.

Ungkapan Lambda ialah fungsi tanpa nama tanpa nama, dan sintaksnya ialah: (parameter_list)->expression. Mereka menampilkan ketanpa nama, kepelbagaian, kari dan penutupan. Dalam aplikasi praktikal, ungkapan Lambda boleh digunakan untuk mentakrifkan fungsi secara ringkas, seperti fungsi penjumlahan sum_lambda=lambdax,y:x+y, dan gunakan fungsi map() pada senarai untuk melaksanakan operasi penjumlahan.

Menggunakan fungsi panggil balik pangkalan data di Golang boleh mencapai: melaksanakan kod tersuai selepas operasi pangkalan data yang ditentukan selesai. Tambah tingkah laku tersuai melalui fungsi berasingan tanpa menulis kod tambahan. Fungsi panggil balik tersedia untuk operasi memasukkan, mengemas kini, memadam dan pertanyaan. Anda mesti menggunakan fungsi sql.Exec, sql.QueryRow atau sql.Query untuk menggunakan fungsi panggil balik.

Melalui pakej pangkalan data/sql perpustakaan standard Go, anda boleh menyambung ke pangkalan data jauh seperti MySQL, PostgreSQL atau SQLite: buat rentetan sambungan yang mengandungi maklumat sambungan pangkalan data. Gunakan fungsi sql.Open() untuk membuka sambungan pangkalan data. Lakukan operasi pangkalan data seperti pertanyaan SQL dan operasi sisipan. Gunakan tangguh untuk menutup sambungan pangkalan data untuk mengeluarkan sumber.

Data JSON boleh disimpan ke dalam pangkalan data MySQL dengan menggunakan perpustakaan gjson atau fungsi json.Unmarshal. Pustaka gjson menyediakan kaedah kemudahan untuk menghuraikan medan JSON dan fungsi json.Unmarshal memerlukan penuding jenis sasaran kepada data JSON unmarshal. Kedua-dua kaedah memerlukan penyediaan pernyataan SQL dan melaksanakan operasi sisipan untuk mengekalkan data ke dalam pangkalan data.

Konsep utama penyegerakan berbilang benang C++: Kunci Mutex: pastikan bahagian kritikal hanya boleh diakses oleh satu utas. Pembolehubah keadaan: Benang boleh dibangkitkan apabila syarat tertentu dipenuhi. Operasi atom: Satu arahan CPU yang tidak terganggu memastikan atomicity pengubahsuaian pembolehubah yang dikongsi.
