mySQL データベースに接続された従来の Access フロント エンドがあります。レガシ アプリには、onclose トリガーに割り当てられた多くの危険なマクロがあります。同じデータベースで実行中の開発中の Web アプリケーションもあります。Web アプリには、運用環境で使用されているモジュールがいくつかあります。私のテストは、データベースの別の専用開発バージョンを備えた別の開発マシンで行われています。
Web アプリにインストールする新しいモジュールには、独自のテーブル セットが付属しています。喜んで同じデータベースに存在しますが、独自のテーブル内のデータの独自のコピーが必要です。そのモジュールの新しいテーブルまたはコード ベースを大幅に変更することを躊躇します。
レガシー データベースには、さまざまなオブジェクトの類似データを保持する合計 6 つのテーブルがあります。現在、これらのテーブルの中で最も重要な 2 つのテーブルのみに取り組んでいます。以下は、これら 2 つのテーブルの列の非常に小さなサブセットのみを表しています。
CREATE TABLE IF NOT EXISTS `agent` (
`age_id` int(11) NOT NULL AUTO_INCREMENT,
`age_agent_email_address` varchar(255) DEFAULT NULL,
`age_welcome_email_sent_y_or_n` varchar(255) DEFAULT 'No',
`age_status` varchar(255) DEFAULT 'Active',
PRIMARY KEY (`age_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC AUTO_INCREMENT=1854 ;
と
CREATE TABLE IF NOT EXISTS `prospecting_contacts` (
`psp_prospect_id` varchar(255) NOT NULL DEFAULT '',
`psp_prospecting_status` varchar(255) DEFAULT 'Active',
`psp_prospect_email_address` varchar(255) DEFAULT NULL,
`psp_remove_from_email_marketing` varchar(255) DEFAULT 'No',
`psp_id` int(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`psp_id`) USING BTREE,
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC AUTO_INCREMENT=2050793 ;
新しいモジュールに付属するいくつかの関連テーブルがあります。そのうちの 1 つだけを更新する必要があると思います。
CREATE TABLE IF NOT EXISTS `phplist_user_user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`email` varchar(255) CHARACTER SET latin1 NOT NULL,
`confirmed` tinyint(4) DEFAULT '0',
`blacklisted` tinyint(4) DEFAULT '0',
`bouncecount` int(11) DEFAULT '0',
`entered` datetime DEFAULT NULL,
`modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`uniqid` varchar(255) CHARACTER SET latin1 DEFAULT NULL,
`htmlemail` tinyint(4) DEFAULT '0',
`subscribepage` int(11) DEFAULT NULL,
`rssfrequency` varchar(100) CHARACTER SET latin1 DEFAULT NULL,
`password` varchar(255) CHARACTER SET latin1 DEFAULT NULL,
`passwordchanged` date DEFAULT NULL,
`disabled` tinyint(4) DEFAULT '0',
`extradata` text CHARACTER SET latin1,
`foreignkey` varchar(100) CHARACTER SET latin1 DEFAULT NULL,
`optedin` tinyint(4) DEFAULT '0',
PRIMARY KEY (`id`),
UNIQUE KEY `email` (`email`),
KEY `foreignkey` (`foreignkey`),
KEY `idx_phplist_user_user_uniqid` (`uniqid`),
KEY `emailidx` (`email`),
KEY `enteredindex` (`entered`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=11 ;
php_list_user_user テーブルには、このクエリの結果であるデータが含まれます。
SELECT `age_agent_email_address` AS `email` FROM `agent`
WHERE `age_status` = 'Active'
UNION DISTINCT
SELECT `psp_prospect_email_address` FROM `prospecting_contacts`
WHERE `psp_prospecting_status` = 'Active'
レガシー アクセス アプリケーションは、agent テーブルとprospecting_contacts テーブルを更新します。新しいモジュールは、php_list_user_user テーブルを更新します。TRIGGER を使用して、情報を前後にコピーできると思います。しかし、データを複製しない方法を探しています。
私は CREATE VIEW を考えていましたが、mysql のマニュアルによると、union と join はその更新機能を壊すと書かれています。http://dev.mysql.com/doc/refman/5.1/en/view-updataability.html
では、データを複製せずにこれら 3 つのテーブルを更新する方法はありますか? それとも、電子メール アドレスを複製して、INSERT と UPDATE で TRIGGER を使用する必要がありますか?