Pierwszym krokiem jest założenie nowego użytkownika. Załóżmy, że otrzymał on numer 2 w polu USER_ID w tabei APP_USERS. Jako użytkownik wzorcowy posłuży nam użytkownik nr 1. Kopiowanie użytkownika polega na skopiowaniu wszystkich rekordów należących do użytkownika nr 1 w tabelach konfiguracyjnych do tych samych tabel ale ze zmienioną na 2 wartością pola OWNER.We wszystkich poniższych skryptach SQL należy ciąg znaków :USER_1 zastąpić numerem użytkownika wzorcowego (w naszym przykładzie 1), a :USER_2 numerem nowego użytkownika (w naszym przykładzie 2).

Tabela z definicją wydruków

INSERT INTO APP_DOCUMENTS
(DOCUMENT_ID, OBJECT_TAG, CAPTION, FILE_NAME, SQL_STATEMENT1, SQL_STATEMENT2, SQL_STATEMENT3, USER_MOD, DATETIME_MOD, OWNER, STATUS, PARAMS_GROUP, SERIAL_PRINTER)
SELECT
GEN_ID(APP_SYSTEM, 1), OBJECT_TAG, CAPTION, FILE_NAME, SQL_STATEMENT1, SQL_STATEMENT2, SQL_STATEMENT3, USER_MOD, DATETIME_MOD, :USER_2, STATUS, PARAMS_GROUP, SERIAL_PRINTER
FROM APP_DOCUMENTS
WHERE
OWNER=:USER_1

Tabela z definicją formularzy

INSERT INTO APP_FORMS
(CAPTION, TAG, FDATA, FITEMS, FATTACHMENTS, DATA_QUERY_SQL, DATA_ITEMS_SQL, DATA_ATTACHMENTS_SQL, ID_FIELD_NAME, DATA_PROC_NAME, ITEMS_PROC_NAME, USER_MOD, DATETIME_MOD, OWNER, STATUS, ITEMS_ID_FIELD_NAME, AUTOINCREMENT_ID, FCRM, FDOCUMENTS, FCOLOR, FMODULE)
SELECT
CAPTION, TAG, FDATA, FITEMS, FATTACHMENTS, DATA_QUERY_SQL, DATA_ITEMS_SQL, DATA_ATTACHMENTS_SQL, ID_FIELD_NAME, DATA_PROC_NAME, ITEMS_PROC_NAME, USER_MOD, DATETIME_MOD, :USER_2, STATUS, ITEMS_ID_FIELD_NAME, AUTOINCREMENT_ID, FCRM, FDOCUMENTS, FCOLOR, FMODULE
FROM APP_FORMS
WHERE
OWNER=:USER_1

Tabela z definicją pól formularzy

INSERT INTO APP_FORMS_ITEMS
(ITEM_ID, FORM_TAG, PAGE_IDX, IDX, CAPTION, FTYPE, READ_ONLY, TAG, HINT, ICON, VALUES_SQL, LIST_FIELDS, LIST_COLUMNS, LIST_FILTER_FIELD, LIST_SORT_FIELD, VALUE_FIELD, DATA_FIELD, FILTER_BUTTON, POPUP_MENU_BUTTON, OBJECT_TAG, USER_MOD, DATETIME_MOD, OWNER, STATUS, FDETAIL, MASTER_FIELD, MASTER_TAG, FREQUIRED, FCOLUMN, TAB_ORDER, WIDTH, LIST_STYLE, VALUE_FIELDS, DISPLAY_FORMAT, DECIMAL_PLACES)
SELECT
GEN_ID(APP_SYSTEM, 1), FORM_TAG, PAGE_IDX, IDX, CAPTION, FTYPE, READ_ONLY, TAG, HINT, ICON, VALUES_SQL, LIST_FIELDS, LIST_COLUMNS, LIST_FILTER_FIELD, LIST_SORT_FIELD, VALUE_FIELD, DATA_FIELD, FILTER_BUTTON, POPUP_MENU_BUTTON, OBJECT_TAG, USER_MOD, DATETIME_MOD, :USER_2, STATUS, FDETAIL, MASTER_FIELD, MASTER_TAG, FREQUIRED, FCOLUMN, TAB_ORDER, WIDTH, LIST_STYLE, VALUE_FIELDS, DISPLAY_FORMAT, DECIMAL_PLACES
FROM APP_FORMS_ITEMS
WHERE
OWNER=:USER_1

Tabela z definicją kolumn siatek danych

INSERT INTO APP_GRID_COLUMNS
(COLUMN_ID, GRID_TAG, FLEVEL, IDX, CAPTION, TAG, FIELD_NAME, FULL_FIELD_NAME, ICON, USER_MOD, DATETIME_MOD, OWNER, STATUS, SUMMARY_TYPE, FUPDATE, FSEARCH, DEFAULT_VALUE, WIDTH, GROUP_IDX, FTYPE, DISPLAY_FORMAT)
SELECT
GEN_ID(APP_SYSTEM, 1), GRID_TAG, FLEVEL, IDX, CAPTION, TAG, FIELD_NAME, FULL_FIELD_NAME, ICON, USER_MOD, DATETIME_MOD, :USER_2, STATUS, SUMMARY_TYPE, FUPDATE, FSEARCH, DEFAULT_VALUE, WIDTH, GROUP_IDX, FTYPE, DISPLAY_FORMAT
FROM APP_GRID_COLUMNS
WHERE
OWNER=:USER_1

Tabela z parametrami jądra aplikacji

INSERT INTO APP_KERNEL_PARAMS
(PARAM_TAG, FTYPE, NAME, FVALUE, STATUS, OWNER, USER_MOD, DATETIME_MOD)
SELECT
PARAM_TAG, FTYPE, NAME, FVALUE, STATUS, :USER_2, USER_MOD, DATETIME_MOD
FROM APP_KERNEL_PARAMS
WHERE
OWNER=:USER_1

Tabela z definicją drzewa nawigacyjnego

INSERT INTO APP_NAVBAR_TREE
(ITEM_ID, PARENT_ID, CAPTION, NAVBAR_TAG, STYLE, FACTION, TAG, HINT, ICON, USER_MOD, DATETIME_MOD, OWNER, STATUS, QUICK_CODE, MENU_CAPTION, FMENU, FTREE)
SELECT
ITEM_ID, PARENT_ID, CAPTION, NAVBAR_TAG, STYLE, FACTION, TAG, HINT, ICON, USER_MOD, DATETIME_MOD, :USER_2, STATUS, QUICK_CODE, MENU_CAPTION, FMENU, FTREE
FROM APP_NAVBAR_TREE
WHERE
OWNER=:USER_1

Tabela z definicją siatek danych

INSERT INTO APP_QUERIES_SQL
(QUERY_ID, FSQL, ID_FIELD_NAME, FULL_ID_FIELD_NAME, USER_MOD, DATETIME_MOD, OWNER, STATUS, DELETE_SQL, CAPTION, TV_SQL, TV_ID_FIELD_NAME, TV_PARENT_FIELD_NAME, TV_CAPTION_FIELD_NAME, FEXPAND)
SELECT
QUERY_ID, FSQL, ID_FIELD_NAME, FULL_ID_FIELD_NAME, USER_MOD, DATETIME_MOD, :USER_2, STATUS, DELETE_SQL, CAPTION, TV_SQL, TV_ID_FIELD_NAME, TV_PARENT_FIELD_NAME, TV_CAPTION_FIELD_NAME, FEXPAND
FROM APP_QUERIES_SQL
WHERE
OWNER=:USER_1

Tabela z definicją przycisków na paskach narzędziowych

INSERT INTO APP_TOOLBAR_ITEMS
(ITEM_ID, TOOLBAR_TAG, IDX, CAPTION, TAG, HINT, FACTION, FORM_MODE, FORM_TAG, ICON, USER_MOD, DATETIME_MOD, OWNER, STATUS)
SELECT
GEN_ID(APP_SYSTEM, 1), TOOLBAR_TAG, IDX, CAPTION, TAG, HINT, FACTION, FORM_MODE, FORM_TAG, ICON, USER_MOD, DATETIME_MOD, :USER_2, STATUS<br />FROM APP_TOOLBAR_ITEMS
WHERE
OWNER=:USER_1

Tabela z definicją pozycji przycisków rozwijanych

INSERT INTO APP_TOOLBAR_SUBITEMS
(TOOLBAR_TAG, TOOLBAR_ITEM_TAG, IDX, CAPTION, TAG, HINT, FACTION, FORM_MODE, FORM_TAG, ICON, USER_MOD, DATETIME_MOD, OWNER, STATUS)
SELECT
TOOLBAR_TAG, TOOLBAR_ITEM_TAG, IDX, CAPTION, TAG, HINT, FACTION, FORM_MODE, FORM_TAG, ICON, USER_MOD, DATETIME_MOD, :USER_2, STATUS
FROM APP_TOOLBAR_SUBITEMS
WHERE
OWNER=:USER_1

Oczywiście po wykonaniu każdej komendy SQL należy zatwierdzić transakcję komendą

COMMIT WORK

To wszystko, teraz można zalogować się do aplikacji jako nowy użytkownik i powinna ona wyglądać i dawać takie same uprawnienia jak dla użytkownika wzorcowego.