テーブルのコピーを作成する方法Issue <!-- /*NS Branding Styles*/ --> .ns-kb-css-body-editor-container { p { font-size: 12pt; font-family: Lato; color: #000000; } span { font-size: 12pt; font-family: Lato; color: #000000; } h2 { font-size: 24pt; font-family: Lato; color: black; } h3 { font-size: 18pt; font-family: Lato; color: black; } h4 { font-size: 14pt; font-family: Lato; color: black; } a { font-size: 12pt; font-family: Lato; color: #00718F; } a:hover { font-size: 12pt; color: #024F69; } a:target { font-size: 12pt; color: #032D42; } a:visited { font-size: 12pt; color: #00718f; } ul { font-size: 12pt; font-family: Lato; } li { font-size: 12pt; font-family: Lato; } img { display: block; max-width: ; width: auto; height: auto; } } テストケースのテーブルのコピーを作成する必要がある場合や、ローテーションされるシャードからデータが切り捨てられる前に、そのデータをバックアップしなければならない場合があります。 ServiceNow ではバックエンドから簡単にテーブルのバックアップを作成できますが、フォーム、リスト、または /sys.scripts.do といったインスタンスからはそうしたバックアップにアクセスすることができません。これは、アプリケーションメタデータテーブル (sys_db_object、sys_dictioary、sys_documentation など) には関連するデータも必要であるために、アプリケーションが新しいテーブルの存在を認識しないことが原因です。 この記事では、既存のテーブルのコピーを作成して、コピーされたテーブルに UI または /sys.scripts.do からアクセスできるようにする方法について説明します。「新しい」テーブルは空であり、データは格納されていません。別のプロセスで、ソーステーブルからデータをコピーする必要があります。 注意:このスクリプトは CMDB テーブルでは機能しません。 注意:このスクリプトは、テーブルローテーションで使用される非推奨のスクリプトインクルードを使用して新しいテーブルを構築します。そのため、結果のテーブルには、新しいテーブルの sys_dictionary レコードに属性 edge_encryption_enabled が追加されるなど、差異が生じる可能性があります。つまり、完全な1対1のコピーではありません。エッジ暗号化属性は、Edge Encryption のライセンスが取得され、セットアップおよび構成されている場合にのみ有効になります。Edge Encryption 自体は非推奨であり、購入できなくなりました。ServiceNow ドキュメントの「 Edge Encryption 」を参照してください。 Release<!-- /*NS Branding Styles*/ --> .ns-kb-css-body-editor-container { p { font-size: 12pt; font-family: Lato; color: #000000; } span { font-size: 12pt; font-family: Lato; color: #000000; } h2 { font-size: 24pt; font-family: Lato; color: black; } h3 { font-size: 18pt; font-family: Lato; color: black; } h4 { font-size: 14pt; font-family: Lato; color: black; } a { font-size: 12pt; font-family: Lato; color: #00718F; } a:hover { font-size: 12pt; color: #024F69; } a:target { font-size: 12pt; color: #032D42; } a:visited { font-size: 12pt; color: #00718f; } ul { font-size: 12pt; font-family: Lato; } li { font-size: 12pt; font-family: Lato; } img { display: block; max-width: ; width: auto; height: auto; } } Resolution<!-- /*NS Branding Styles*/ --> .ns-kb-css-body-editor-container { p { font-size: 12pt; font-family: Lato; color: #000000; } span { font-size: 12pt; font-family: Lato; color: #000000; } h2 { font-size: 24pt; font-family: Lato; color: black; } h3 { font-size: 18pt; font-family: Lato; color: black; } h4 { font-size: 14pt; font-family: Lato; color: black; } a { font-size: 12pt; font-family: Lato; color: #00718F; } a:hover { font-size: 12pt; color: #024F69; } a:target { font-size: 12pt; color: #032D42; } a:visited { font-size: 12pt; color: #00718f; } ul { font-size: 12pt; font-family: Lato; } li { font-size: 12pt; font-family: Lato; } img { display: block; max-width: ; width: auto; height: auto; } } New York リリース以前: /sys.scripts.do に移動します。 次のコードをコピーし、環境に合わせてカスタマイズします。 最初の引数はソーステーブル、つまりコピーするテーブルです。2 番目の引数は、新しいテーブルであるターゲットテーブルです。3 番目の引数はブール値で、インデックスの作成を希望しない場合や作成する必要がない場合は false に設定します。(テーブルが空になるため、どちらの場合でも作成時間が速くなります。) cpTable('sys_upgrade_history_log', 'u_testcase', true); function cpTable(strOldTable, strNewTable, bCopyIndexes) { var tu = new TableUtils(strNewTable); var bNewTableAlreadyExists = tu.tableExists(); if (bNewTableAlreadyExists) { gs.print("WARNING: Target Table " + strNewTable + " already exists! Please choose a new target table name"); } else { var gr = new GlideRecord(strOldTable); gr.initialize(); var td = GlideTableDescriptor.get(strOldTable); var tdNewTable = new TableDescriptor(strNewTable, gr.getLabel()); var dbo = new GlideRecord("sys_db_object"); dbo.addEncodedQuery("super_classISNOTEMPTY^name=" + strOldTable); dbo.setLimit(1); dbo.query(); if (dbo.next()) { tdNewTable.setExtends(dbo.super_class + ''); } tdNewTable.setFields(gr); tdNewTable.copyAttributes(td); tdNewTable.setRoles(td); tdNewTable.create(); if (bCopyIndexes) { tdNewTable.copyIndexes(strOldTable, strNewTable); } }} [スクリプトを実行] をクリックします。 このコードは、インスタンスに u_testcase という名前の新しいテーブルを作成します。これで、/u_testcase_list.do および GlideRecord('u_testcase') からこのテーブルにアクセスできるようになりました。 出力は、次の例のようになります。 [0:00:01.621] Script completed in scope global: scriptCreating table: u_testcaseTableCreate for: u_testcaseDBTable.create() for: u_testcaseReplication is not enabled on table: u_testcase, not queueing replication table create special db event*** Script: Begin ResourceSupport.buildTableResources(u_testcase, undefined)*** Script: End ResourceSupport.buildTableResourcesLicensingTableCreateListener: Initializing licensing attrs for table u_testcaseTime: 0:00:00.615 id: tundra_1[glide.2] for: SELECT sys_storage_alias0.`table_name`, sys_storage_alias0.`element_name`, sys_storage_alias0.`storage_alias` FROM sys_storage_alias sys_storage_alias0 WHERE sys_storage_alias0.`storage_alias` != sys_storage_alias0.`element_name` /* tundra004, gs:329947A4DBAE4700671C51035E9619B8, tx:52c94328dbae4700671c51035e9619cb */ Creating index(es): ALTER TABLE `u_testcase`ADD INDEX (`sys_source_table`) ,ADD INDEX (`update_set`) ,ADD INDEX (`upgrade_history`) Duplicate index, skipping: u_testcase([sys_source_table]) NONUNIQUEDuplicate index, skipping: u_testcase([update_set]) NONUNIQUERedundant index check on u_testcase found redundant index upgrade_history (upgrade_history) NONUNIQUE; caused by new index (upgrade_history,file_name,sys_recorded_at) NONUNIQUERedundant index check on u_testcase found 1 redundant indexesCreating index(es): ALTER TABLE `u_testcase`ADD INDEX (`upgrade_history`, `file_name`, `sys_recorded_at`) ,ADD INDEX (`upgrade_history`, `order`) ,ADD INDEX (`upgrade_history`, `disposition`, `resolution_status`, `changed`, `order`) ,ADD INDEX (`upgrade_history`, `resolution_status`, `disposition`, `type_priority`) ,ADD INDEX (`upgrade_history`, `disposition`, `changed`) ,ADD INDEX (`order`) Dropping index(es): ALTER TABLE `u_testcase` DROP INDEX `upgrade_history` 同じコードを再度実行すると、エラーが発生し、次のように表示されます。 [0:00:00.000] Script completed in scope global: script*** Script: WARNING: Target Table u_testcase already exists! Please choose a new target table name New York およびそれ以降リリース: /sys.scripts.do に移動します。 次のコードをコピーし、環境に合わせてカスタマイズします。 最初の引数はソーステーブル、つまりコピーするテーブルです。2 番目の引数は、新しいテーブルであるターゲットテーブルです。3 番目の引数はブール値で、インデックスの作成を希望しない場合や作成する必要がない場合は false に設定します。(テーブルが空になるため、どちらの場合でも作成時間が速くなります。) cpTable('sys_upgrade_history_log', 'u_testcase', true); function cpTable(strOldTable, strNewTable, bCopyIndexes) { var tu = new TableUtils(strNewTable); var bNewTableAlreadyExists = tu.tableExists(); if (bNewTableAlreadyExists) { gs.print("WARNING: Target Table " + strNewTable + " already exists! Please choose a new target table name"); } else { var gr = new GlideRecord(strOldTable); gr.initialize(); var td = GlideTableDescriptor.get(strOldTable); var tdNewTable = new SNC.TableRotationBootstrap(strNewTable, gr.getLabel()); var dbo = new GlideRecord("sys_db_object"); dbo.addEncodedQuery("super_classISNOTEMPTY^name=" + strOldTable); dbo.setLimit(1); dbo.query(); if (dbo.next()) { tdNewTable.setExtends(dbo.super_class.name + ''); } tdNewTable.setFields(gr); tdNewTable.copyAttributes(td); tdNewTable.create(); if (bCopyIndexes) { tdNewTable.copyIndexes(strOldTable, strNewTable); } }} [スクリプトを実行] をクリックします。 このコードは、インスタンスに u_testcase という名前の新しいテーブルを作成します。これで、/u_testcase_list.do および GlideRecord('u_testcase') からこのテーブルにアクセスできるようになりました。 出力は、次の例のようになります。 Creating table: u_testcaseTableCreate for: u_testcaseDBTable.create() for: u_testcaseReplication is not enabled on table: u_testcase, not queueing replication table create special db event*** Script: Begin ResourceSupport.buildTableResources(u_testcase, undefined)*** Script: End ResourceSupport.buildTableResourcesLicensingTableCreateListener: Initializing licensing attrs for table u_testcaseCreating index(es): ALTER TABLE `u_testcase`ADD INDEX (`sys_source_table`) ,ADD INDEX (`upgrade_history`) ,ADD INDEX (`update_set`) [0:00:13.170] DBTable.create of: u_testcase[0:00:14.839] Table create for: u_testcaseDuplicate index, skipping: u_testcase([sys_source_table]) NONUNIQUEDuplicate index, skipping: u_testcase([update_set]) NONUNIQUERedundant index check on u_testcase found redundant index upgrade_history (upgrade_history) NONUNIQUE; caused by new index (upgrade_history,order) NONUNIQUERedundant index check on u_testcase found 1 redundant indexesCreating index(es): ALTER TABLE `u_testcase`ADD INDEX (`upgrade_history`, `order`) ,ADD INDEX (`upgrade_history`, `resolution_status`, `disposition`, `type_priority`) ,ADD INDEX (`upgrade_history`, `file_name`, `sys_recorded_at`) ,ADD INDEX (`upgrade_history`, `disposition`, `changed`) ,ADD INDEX (`upgrade_history`, `disposition`, `resolution_status`, `changed`, `order`) ,ADD INDEX (`order`) Dropping index(es): ALTER TABLE `u_testcase` DROP INDEX `upgrade_history`Altering storage table [sh$sys_cache_flush]: ALTER TABLE sh$sys_cache_flush ADD `sh$context` VARCHAR(32) , ADD `sh$operation` VARCHAR(40) , ADD `sh$change_count` INTEGER , ADD `sh$first_recorded` DATETIME , ADD `sh$last_recorded` DATETIME , ADD `sh$sequence` VARCHAR(40) , ADD `sh$first_txn_id` VARCHAR(32) , ADD INDEX `mnixgjyj_source_primary`(`sys_id`) *** Script: Begin ResourceSupport.buildTableResources(sh$sys_cache_flush, undefined)*** Script: End ResourceSupport.buildTableResources