要将触发器从源数据库复制到目标数据库,请在定义触发器时指定 trigger 标记的 selection="included" 属性,如以下代码示例所示。
<triggers> <trigger selection= "included"> <database>west1000</database> <subject_table_database>west1000</subject_table_database> <table>employee</table> <name>RaiseTrig</name> <action_time enabled="NO">BEFORE</action_time> </trigger> </triggers>
参数 | 值 |
---|---|
selection |
|
database | 触发器所在的数据库的名称。 |
subject_table_database | 与触发器关联的表所在的数据库的名称。 |
table | 与触发器关联的表的名称。 |
name | 触发器的名称。 |
action_time |
|
enabled |
要启用 action_time 参数,该值必须为 "YES"。如果该值为 "NO",action_time 参数将无效。 要确认目标系统中是启用还是禁用了某个触发器,可使用 dbc.TriggersX 中的 SELECT 查询,并查看 EnabledFlag 列。 |
规则和限制
- 复制触发器而不复制与其关联的表将导致错误。
- 如果要复制的对象在目标数据库中不存在,则会在目标数据库中创建该对象。如果对象在目标数据库中存在,则除非 overwrite_existing_objects 属性被设置为 false,否则将覆盖该对象。这种情况下,将生成创建时错误。
- 复制表时,如果目标系统中已经存在该表并具有关联的触发器,将覆盖目标表,并在新复制的表上替换触发器。
- 尝试重命名复制的触发器所关联或引用的表或重新指定该表的位置会导致错误。
- 如果触发器定义中的触发器名称不是完全限定名称,将在与源触发器数据库同名的数据库中创建该触发器。
- 如果触发器定义中的表名称不是完全限定名称,这些表必须位于与源触发器数据库同名的数据库中,以避免出错。
示例
以下示例会在源计算机上创建一个触发器,但未在定义中包含完全限定的对象名称:CREATE TRIGGER RaiseTrig AFTER INSERT ON Employee FOR EACH ROW ( INSERT INTO SalaryLog VALUES ('Hello','Hi',23, 43); );在此示例中,将触发器复制到目标系统时,会在与源触发器数据库同名的数据库中创建该触发器。如果该数据库不包含 Employee 和 SalaryLog 表,则会出错。