mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-02-17 02:51:36 -05:00
Add advanced tab (#24267)
This commit is contained in:
@@ -33,6 +33,7 @@ export const ViewMemoryServerPropertiesDocUrl = 'https://learn.microsoft.com/sql
|
|||||||
export const ViewProcessorsServerPropertiesDocUrl = 'https://learn.microsoft.com/sql/database-engine/configure-windows/server-properties-processors-page';
|
export const ViewProcessorsServerPropertiesDocUrl = 'https://learn.microsoft.com/sql/database-engine/configure-windows/server-properties-processors-page';
|
||||||
export const ViewSecurityServerPropertiesDocUrl = 'https://learn.microsoft.com/sql/database-engine/configure-windows/server-properties-security-page';
|
export const ViewSecurityServerPropertiesDocUrl = 'https://learn.microsoft.com/sql/database-engine/configure-windows/server-properties-security-page';
|
||||||
export const ViewDatabaseSettingsPropertiesDocUrl = 'https://learn.microsoft.com/sql/database-engine/configure-windows/server-properties-database-settings-page';
|
export const ViewDatabaseSettingsPropertiesDocUrl = 'https://learn.microsoft.com/sql/database-engine/configure-windows/server-properties-database-settings-page';
|
||||||
|
export const ViewAdvancedServerPropertiesDocUrl = 'https://learn.microsoft.com/sql/database-engine/configure-windows/server-properties-advanced-page';
|
||||||
export const DetachDatabaseDocUrl = 'https://go.microsoft.com/fwlink/?linkid=2240322';
|
export const DetachDatabaseDocUrl = 'https://go.microsoft.com/fwlink/?linkid=2240322';
|
||||||
export const AttachDatabaseDocUrl = 'https://learn.microsoft.com/sql/relational-databases/databases/attach-a-database#to-attach-a-database';
|
export const AttachDatabaseDocUrl = 'https://learn.microsoft.com/sql/relational-databases/databases/attach-a-database#to-attach-a-database';
|
||||||
export const DatabaseGeneralPropertiesDocUrl = 'https://learn.microsoft.com/sql/relational-databases/databases/database-properties-general-page';
|
export const DatabaseGeneralPropertiesDocUrl = 'https://learn.microsoft.com/sql/relational-databases/databases/database-properties-general-page';
|
||||||
|
|||||||
@@ -546,6 +546,20 @@ export interface Server extends ObjectManagement.SqlObject {
|
|||||||
dataLocation: string;
|
dataLocation: string;
|
||||||
logLocation: string;
|
logLocation: string;
|
||||||
backupLocation: string;
|
backupLocation: string;
|
||||||
|
allowTriggerToFireOthers: boolean;
|
||||||
|
blockedProcThreshold: NumericServerProperty;
|
||||||
|
cursorThreshold: NumericServerProperty;
|
||||||
|
defaultFullTextLanguage: string;
|
||||||
|
defaultLanguage: string;
|
||||||
|
fullTextUpgradeOption: string;
|
||||||
|
maxTextReplicationSize: NumericServerProperty;
|
||||||
|
optimizeAdHocWorkloads: boolean;
|
||||||
|
scanStartupProcs: boolean;
|
||||||
|
twoDigitYearCutoff: number;
|
||||||
|
costThresholdParallelism: NumericServerProperty;
|
||||||
|
locks: NumericServerProperty;
|
||||||
|
maxDegreeParallelism: NumericServerProperty;
|
||||||
|
queryWait: NumericServerProperty;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -573,6 +587,8 @@ export interface NumericServerProperty {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export interface ServerViewInfo extends ObjectManagement.ObjectViewInfo<Server> {
|
export interface ServerViewInfo extends ObjectManagement.ObjectViewInfo<Server> {
|
||||||
|
languageOptions: string[];
|
||||||
|
fullTextUpgradeOptions: string[];
|
||||||
}
|
}
|
||||||
|
|
||||||
export const enum FileGrowthType {
|
export const enum FileGrowthType {
|
||||||
|
|||||||
@@ -328,6 +328,20 @@ export const databaseSettingsText = localize('objectManagement.databaseSettings'
|
|||||||
export const compressBackupText = localize('objectManagement.compressBackupText', "Compress Backup");
|
export const compressBackupText = localize('objectManagement.compressBackupText', "Compress Backup");
|
||||||
export const backupChecksumText = localize('objectManagement.backupChecksumText', "Backup checksum");
|
export const backupChecksumText = localize('objectManagement.backupChecksumText', "Backup checksum");
|
||||||
export const backupAndRestoreText = localize('objectManagement.backupAndRestoreText', "Backup and Restore");
|
export const backupAndRestoreText = localize('objectManagement.backupAndRestoreText', "Backup and Restore");
|
||||||
|
export const allowTriggerToFireOthersLabel = localize('objectManagement.allowTriggerToFireOthersLabel', "Allow Triggers to Fire Others");
|
||||||
|
export const blockedProcThresholdLabel = localize('objectManagement.blockedProcThresholdLabel', "Blocked Process Threshold");
|
||||||
|
export const cursorThresholdLabel = localize('objectManagement.cursorThresholdLabel', "Cursor Threshold");
|
||||||
|
export const defaultFullTextLanguageLabel = localize('objectManagement.defaultFullTextLanguageLabel', "Default Full-Text Language");
|
||||||
|
export const defaultLanguageLabel = localize('objectManagement.defaultLanguageLabel', "Default Language");
|
||||||
|
export const fullTextUpgradeOptionLabel = localize('objectManagement.fullTextUpgradeOptionLabel', "Full-Text Upgrade Option");
|
||||||
|
export const maxTextReplicationSizeLabel = localize('objectManagement.maxTextReplicationSizeLabel', "Max Text Replication Size");
|
||||||
|
export const optimizeAdHocWorkloadsLabel = localize('objectManagement.optimizeAdHocWorkloadsLabel', "Optimize Ad Hoc Workloads");
|
||||||
|
export const scanStartupProcsLabel = localize('objectManagement.scanStartupProcsLabel', "Scan Startup Procs ");
|
||||||
|
export const twoDigitYearCutoffLabel = localize('objectManagement.twoDigitYearCutoffLabel', "Two Digit Year Cutoff");
|
||||||
|
export const costThresholdParallelismLabel = localize('objectManagement.costThresholdParallelismLabel', "Cost Threshold Parallelism");
|
||||||
|
export const locksLabel = localize('objectManagement.locksLabel', "Locks");
|
||||||
|
export const maxDegreeParallelismLabel = localize('objectManagement.maxDegreeParallelismLabel', "Max Degree Parallelism");
|
||||||
|
export const queryWaitLabel = localize('objectManagement.queryWaitLabel', "Query Wait");
|
||||||
|
|
||||||
//Database properties Dialog
|
//Database properties Dialog
|
||||||
export const LastDatabaseBackupText = localize('objectManagement.lastDatabaseBackup', "Last Database Backup");
|
export const LastDatabaseBackupText = localize('objectManagement.lastDatabaseBackup', "Last Database Backup");
|
||||||
|
|||||||
@@ -69,6 +69,23 @@ export class ServerPropertiesDialog extends ObjectManagementDialogBase<Server, S
|
|||||||
private logLocationInput: azdata.InputBoxComponent;
|
private logLocationInput: azdata.InputBoxComponent;
|
||||||
private backupLocationInput: azdata.InputBoxComponent;
|
private backupLocationInput: azdata.InputBoxComponent;
|
||||||
|
|
||||||
|
private advancedTab: azdata.Tab;
|
||||||
|
private readonly advancedTabId: string = 'advancedId';
|
||||||
|
private allowTriggerToFireOthersDropdown: azdata.DropDownComponent;
|
||||||
|
private blockedProcThresholdInput: azdata.InputBoxComponent;
|
||||||
|
private cursorThresholdInput: azdata.InputBoxComponent;
|
||||||
|
private defaultFullTextLanguageInput: azdata.InputBoxComponent;
|
||||||
|
private defaultLanguageDropdown: azdata.DropDownComponent;
|
||||||
|
private fullTextUpgradeOptionDropdown: azdata.DropDownComponent;
|
||||||
|
private maxTextReplicationSizeInput: azdata.InputBoxComponent;
|
||||||
|
private optimizeAdHocWorkloadsDropdown: azdata.DropDownComponent;
|
||||||
|
private scanStartupProcsDropdown: azdata.DropDownComponent;
|
||||||
|
private twoDigitYearCutoffInput: azdata.InputBoxComponent;
|
||||||
|
private costThresholdParallelismInput: azdata.InputBoxComponent;
|
||||||
|
private locksInput: azdata.InputBoxComponent;
|
||||||
|
private maxDegreeParallelismInput: azdata.InputBoxComponent;
|
||||||
|
private queryWaitInput: azdata.InputBoxComponent;
|
||||||
|
|
||||||
private activeTabId: string;
|
private activeTabId: string;
|
||||||
|
|
||||||
constructor(objectManagementService: IObjectManagementService, options: ObjectManagementDialogOptions) {
|
constructor(objectManagementService: IObjectManagementService, options: ObjectManagementDialogOptions) {
|
||||||
@@ -93,6 +110,9 @@ export class ServerPropertiesDialog extends ObjectManagementDialogBase<Server, S
|
|||||||
case this.databaseSettingsTabId:
|
case this.databaseSettingsTabId:
|
||||||
helpUrl = constants.ViewDatabaseSettingsPropertiesDocUrl;
|
helpUrl = constants.ViewDatabaseSettingsPropertiesDocUrl;
|
||||||
break;
|
break;
|
||||||
|
case this.advancedTabId:
|
||||||
|
helpUrl = constants.ViewAdvancedServerPropertiesDocUrl;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -107,7 +127,8 @@ export class ServerPropertiesDialog extends ObjectManagementDialogBase<Server, S
|
|||||||
this.initializeProcessorsSection();
|
this.initializeProcessorsSection();
|
||||||
this.initializeSecuritySection();
|
this.initializeSecuritySection();
|
||||||
this.initializeDatabaseSettingsSection();
|
this.initializeDatabaseSettingsSection();
|
||||||
const serverPropertiesTabGroup = { title: '', tabs: [this.generalTab, this.memoryTab, this.processorsTab, this.securityTab, this.databaseSettingsTab] };
|
this.initializeAdvancedSection();
|
||||||
|
const serverPropertiesTabGroup = { title: '', tabs: [this.generalTab, this.memoryTab, this.processorsTab, this.securityTab, this.databaseSettingsTab, this.advancedTab] };
|
||||||
const serverPropertiesTabbedPannel = this.modelView.modelBuilder.tabbedPanel()
|
const serverPropertiesTabbedPannel = this.modelView.modelBuilder.tabbedPanel()
|
||||||
.withTabs([serverPropertiesTabGroup])
|
.withTabs([serverPropertiesTabGroup])
|
||||||
.withProps({
|
.withProps({
|
||||||
@@ -498,8 +519,10 @@ export class ServerPropertiesDialog extends ObjectManagementDialogBase<Server, S
|
|||||||
if (this.sqlServerAndWindowsAuthRadioButton.checked) {
|
if (this.sqlServerAndWindowsAuthRadioButton.checked) {
|
||||||
this.objectInfo.authenticationMode = ServerLoginMode.Mixed;
|
this.objectInfo.authenticationMode = ServerLoginMode.Mixed;
|
||||||
}
|
}
|
||||||
|
if (this.objectInfo.authenticationMode !== this.originalObjectInfo.authenticationMode) {
|
||||||
await vscode.window.showInformationMessage(localizedConstants.needToRestartServer, { modal: true });
|
await vscode.window.showInformationMessage(localizedConstants.needToRestartServer, { modal: true });
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private async handleAuditLevelChange(): Promise<void> {
|
private async handleAuditLevelChange(): Promise<void> {
|
||||||
if (this.noneRadioButton.checked) {
|
if (this.noneRadioButton.checked) {
|
||||||
@@ -607,4 +630,148 @@ export class ServerPropertiesDialog extends ObjectManagementDialogBase<Server, S
|
|||||||
}
|
}
|
||||||
return undefined;
|
return undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private initializeAdvancedSection(): void {
|
||||||
|
this.allowTriggerToFireOthersDropdown = this.createDropdown(localizedConstants.allowTriggerToFireOthersLabel, async (newValue) => {
|
||||||
|
this.objectInfo.allowTriggerToFireOthers = newValue === 'True';
|
||||||
|
}, ['True', 'False'], this.objectInfo.allowTriggerToFireOthers ? 'True' : 'False');
|
||||||
|
const allowTriggerToFireOthersContainer = this.createLabelInputContainer(localizedConstants.allowTriggerToFireOthersLabel, this.allowTriggerToFireOthersDropdown);
|
||||||
|
|
||||||
|
this.blockedProcThresholdInput = this.createInputBox(async (newValue) => {
|
||||||
|
this.objectInfo.blockedProcThreshold.value = +newValue;
|
||||||
|
}, {
|
||||||
|
ariaLabel: localizedConstants.blockedProcThresholdLabel,
|
||||||
|
inputType: 'number',
|
||||||
|
min: this.objectInfo.blockedProcThreshold.minimumValue,
|
||||||
|
max: this.objectInfo.blockedProcThreshold.maximumValue,
|
||||||
|
value: this.objectInfo.blockedProcThreshold.value.toString()
|
||||||
|
});
|
||||||
|
const blockedProcThresholdContainer = this.createLabelInputContainer(localizedConstants.blockedProcThresholdLabel, this.blockedProcThresholdInput);
|
||||||
|
|
||||||
|
this.cursorThresholdInput = this.createInputBox(async (newValue) => {
|
||||||
|
this.objectInfo.cursorThreshold.value = +newValue;
|
||||||
|
}, {
|
||||||
|
ariaLabel: localizedConstants.cursorThresholdLabel,
|
||||||
|
inputType: 'number',
|
||||||
|
min: this.objectInfo.cursorThreshold.minimumValue,
|
||||||
|
max: this.objectInfo.cursorThreshold.maximumValue,
|
||||||
|
value: this.objectInfo.cursorThreshold.value.toString()
|
||||||
|
});
|
||||||
|
const cursorThresholdContainer = this.createLabelInputContainer(localizedConstants.cursorThresholdLabel, this.cursorThresholdInput);
|
||||||
|
|
||||||
|
this.defaultFullTextLanguageInput = this.createInputBox(async (newValue) => {
|
||||||
|
this.objectInfo.defaultFullTextLanguage = newValue;
|
||||||
|
}, {
|
||||||
|
ariaLabel: localizedConstants.defaultFullTextLanguageLabel,
|
||||||
|
value: this.objectInfo.defaultFullTextLanguage
|
||||||
|
});
|
||||||
|
const defaultFullTextLanguageContainer = this.createLabelInputContainer(localizedConstants.defaultFullTextLanguageLabel, this.defaultFullTextLanguageInput);
|
||||||
|
|
||||||
|
this.defaultLanguageDropdown = this.createDropdown(localizedConstants.defaultLanguageLabel, async (newValue) => {
|
||||||
|
this.objectInfo.defaultLanguage = newValue;
|
||||||
|
}, this.viewInfo.languageOptions, this.objectInfo.defaultLanguage);
|
||||||
|
const defaultLanguageContainer = this.createLabelInputContainer(localizedConstants.defaultLanguageLabel, this.defaultLanguageDropdown);
|
||||||
|
|
||||||
|
this.fullTextUpgradeOptionDropdown = this.createDropdown(localizedConstants.fullTextUpgradeOptionLabel, async (newValue) => {
|
||||||
|
this.objectInfo.fullTextUpgradeOption = newValue;
|
||||||
|
}, this.viewInfo.fullTextUpgradeOptions, this.objectInfo.fullTextUpgradeOption);
|
||||||
|
const fullTextUpgradeOptionContainer = this.createLabelInputContainer(localizedConstants.fullTextUpgradeOptionLabel, this.fullTextUpgradeOptionDropdown);
|
||||||
|
|
||||||
|
this.maxTextReplicationSizeInput = this.createInputBox(async (newValue) => {
|
||||||
|
this.objectInfo.maxTextReplicationSize.value = +newValue;
|
||||||
|
}, {
|
||||||
|
ariaLabel: localizedConstants.maxTextReplicationSizeLabel,
|
||||||
|
inputType: 'number',
|
||||||
|
min: this.objectInfo.maxTextReplicationSize.minimumValue,
|
||||||
|
max: this.objectInfo.maxTextReplicationSize.maximumValue,
|
||||||
|
value: this.objectInfo.maxTextReplicationSize.value.toString()
|
||||||
|
});
|
||||||
|
const maxTextReplicationSizeContainer = this.createLabelInputContainer(localizedConstants.maxTextReplicationSizeLabel, this.maxTextReplicationSizeInput);
|
||||||
|
|
||||||
|
this.optimizeAdHocWorkloadsDropdown = this.createDropdown(localizedConstants.optimizeAdHocWorkloadsLabel, async (newValue) => {
|
||||||
|
this.objectInfo.optimizeAdHocWorkloads = newValue === 'True';
|
||||||
|
}, ['True', 'False'], this.objectInfo.optimizeAdHocWorkloads ? 'True' : 'False');
|
||||||
|
const optimizeAdHocWorkloadsContainer = this.createLabelInputContainer(localizedConstants.optimizeAdHocWorkloadsLabel, this.optimizeAdHocWorkloadsDropdown);
|
||||||
|
|
||||||
|
this.scanStartupProcsDropdown = this.createDropdown(localizedConstants.scanStartupProcsLabel, async (newValue) => {
|
||||||
|
this.objectInfo.scanStartupProcs = newValue === 'True';
|
||||||
|
}, ['True', 'False'], this.objectInfo.scanStartupProcs ? 'True' : 'False');
|
||||||
|
const scanStartupProcsContainer = this.createLabelInputContainer(localizedConstants.scanStartupProcsLabel, this.scanStartupProcsDropdown);
|
||||||
|
|
||||||
|
this.twoDigitYearCutoffInput = this.createInputBox(async (newValue) => {
|
||||||
|
this.objectInfo.twoDigitYearCutoff = +newValue;
|
||||||
|
}, {
|
||||||
|
ariaLabel: localizedConstants.twoDigitYearCutoffLabel,
|
||||||
|
inputType: 'number',
|
||||||
|
value: this.objectInfo.twoDigitYearCutoff.toString()
|
||||||
|
});
|
||||||
|
const twoDigitYearCutoffContainer = this.createLabelInputContainer(localizedConstants.twoDigitYearCutoffLabel, this.twoDigitYearCutoffInput);
|
||||||
|
|
||||||
|
this.costThresholdParallelismInput = this.createInputBox(async (newValue) => {
|
||||||
|
this.objectInfo.costThresholdParallelism.value = +newValue;
|
||||||
|
}, {
|
||||||
|
ariaLabel: localizedConstants.costThresholdParallelismLabel,
|
||||||
|
inputType: 'number',
|
||||||
|
min: this.objectInfo.costThresholdParallelism.minimumValue,
|
||||||
|
max: this.objectInfo.costThresholdParallelism.maximumValue,
|
||||||
|
value: this.objectInfo.costThresholdParallelism.value.toString()
|
||||||
|
});
|
||||||
|
const costThresholdParallelismContainer = this.createLabelInputContainer(localizedConstants.costThresholdParallelismLabel, this.costThresholdParallelismInput);
|
||||||
|
|
||||||
|
this.locksInput = this.createInputBox(async (newValue) => {
|
||||||
|
this.objectInfo.locks.value = +newValue;
|
||||||
|
}, {
|
||||||
|
ariaLabel: localizedConstants.locksLabel,
|
||||||
|
inputType: 'number',
|
||||||
|
max: this.objectInfo.locks.maximumValue,
|
||||||
|
value: this.objectInfo.locks.value.toString()
|
||||||
|
});
|
||||||
|
const locksContainer = this.createLabelInputContainer(localizedConstants.locksLabel, this.locksInput);
|
||||||
|
|
||||||
|
this.maxDegreeParallelismInput = this.createInputBox(async (newValue) => {
|
||||||
|
this.objectInfo.maxDegreeParallelism.value = +newValue;
|
||||||
|
}, {
|
||||||
|
ariaLabel: localizedConstants.maxDegreeParallelismLabel,
|
||||||
|
inputType: 'number',
|
||||||
|
min: this.objectInfo.maxDegreeParallelism.minimumValue,
|
||||||
|
max: this.objectInfo.maxDegreeParallelism.maximumValue,
|
||||||
|
value: this.objectInfo.maxDegreeParallelism.value.toString()
|
||||||
|
});
|
||||||
|
const maxDegreeParallelismContainer = this.createLabelInputContainer(localizedConstants.maxDegreeParallelismLabel, this.maxDegreeParallelismInput);
|
||||||
|
|
||||||
|
this.queryWaitInput = this.createInputBox(async (newValue) => {
|
||||||
|
this.objectInfo.queryWait.value = +newValue;
|
||||||
|
}, {
|
||||||
|
ariaLabel: localizedConstants.queryWaitLabel,
|
||||||
|
inputType: 'number',
|
||||||
|
min: this.objectInfo.queryWait.minimumValue,
|
||||||
|
max: this.objectInfo.queryWait.maximumValue,
|
||||||
|
value: this.objectInfo.queryWait.value.toString()
|
||||||
|
});
|
||||||
|
const queryWaitContainer = this.createLabelInputContainer(localizedConstants.queryWaitLabel, this.queryWaitInput);
|
||||||
|
|
||||||
|
const miscellaneousSection = this.createGroup('Miscellaneous', [
|
||||||
|
allowTriggerToFireOthersContainer,
|
||||||
|
blockedProcThresholdContainer,
|
||||||
|
cursorThresholdContainer,
|
||||||
|
defaultFullTextLanguageContainer,
|
||||||
|
defaultLanguageContainer,
|
||||||
|
fullTextUpgradeOptionContainer,
|
||||||
|
maxTextReplicationSizeContainer,
|
||||||
|
optimizeAdHocWorkloadsContainer,
|
||||||
|
scanStartupProcsContainer,
|
||||||
|
twoDigitYearCutoffContainer
|
||||||
|
], true);
|
||||||
|
const parallelismSection = this.createGroup('Parallelism', [
|
||||||
|
costThresholdParallelismContainer,
|
||||||
|
locksContainer,
|
||||||
|
maxDegreeParallelismContainer,
|
||||||
|
queryWaitContainer
|
||||||
|
], true);
|
||||||
|
|
||||||
|
const advancedTabContainer = this.createGroup('', [miscellaneousSection, parallelismSection])
|
||||||
|
|
||||||
|
this.advancedTab = this.createTab(this.advancedTabId, localizedConstants.AdvancedSectionHeader, advancedTabContainer);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user