如果使用抽取实用程序 (dbxtract) 或 [抽取数据库向导] 创建远程数据库,则可以编写一个存储过程来将设置唯一数据库标识号的任务自动化。
前提条件
任何具有 MANAGE REPLICATION 系统特权的用户都能创建挂接过程。但是,为了确保挂接能够访问用来将信息传入和传出挂接的 #hook_dict 表,挂接必须满足以下要求之一:
由具有 SELECT ANY TABLE 和 UPDATE ANY TABLE 系统特权的用户拥有。
使用 CREATE PROCEDURE 语句的 SQL SECURITY INVOKER 子句定义。
创建一个名为 sp_hook_dbxtract_begin 的存储过程。
例如,要为 user_id 为 1001 的远程用户 user2 抽取一个数据库,可执行以下语句:
SET OPTION "PUBLIC"."global_database_id" = '1'; CREATE TABLE extract_id (next_id INTEGER NOT NULL) ; INSERT INTO extract_id VALUES( 1 ); CREATE PROCEDURE sp_hook_dbxtract_begin AS DECLARE @next_id INTEGER UPDATE extract_id SET next_id = next_id + 1000 SELECT @next_id = (next_id ) FROM extract_id COMMIT UPDATE #hook_dict SET VALUE = @next_id WHERE NAME = 'extracted_db_global_id'; |
每个抽取或重新抽取的数据库将得到一个不同的 global_database_id。第一个从 1001 开始,下一个则从 2001 开始,依此类推。
通过 -v 选项运行抽取实用程序 (dbxtract) 或运行 [抽取数据库向导] 来抽取远程数据。抽取实用程序会执行以下任务:
创建一个名为 #hook_dict 的临时表,其内容包括:
名称 | 值 |
---|---|
extracted_db_global_id |
正在被抽取的用户 ID |
如果您将 sp_hook_dbxtract_begin 过程编写为修改行的 value 列,则该值将用作抽取的数据库的 global_database_id 选项,且标记 DEFAULT GLOBAL AUTOINCREMENT 值的主键值范围的起始值。
未定义 sp_hook_dbxtract_begin 过程时,被抽取的数据库的 global_database_id 将被设置为 101。
如果定义了 sp_hook_dbxtract_begin 过程,但它未修改 #hook_dict 中的任何行,则 global_database_id 仍被设置为 101。
调用 sp_hook_dbxtract_begin。
输出以下信息以帮助调试过程挂接:
找到的过程挂接。
调用过程挂接之前 #hook_dict 的内容。
调用过程挂接之后 #hook_dict 的内容。
![]() |
使用DocCommentXchange讨论此页。
|
版权 © 2013, SAP 股份公司或其关联公司. - SAP Sybase SQL Anywhere 16.0 |