sql_cmd 0.3.1 → 0.3.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4df6d540e8235db2ebe06497947f8be105e7232f040d988378f75996be6624c2
4
- data.tar.gz: c2b4f51d378cd9b7372aca4b364270756d3a55640d85110e9999c5f79c52e243
3
+ metadata.gz: 2026009b040577e9e545648215f0bed077ff75c6b901aeb0144643a07be6262e
4
+ data.tar.gz: 45656864eaae255a6eb8103605f33e2ec5fd87c3375af4e3750bd935bf32abab
5
5
  SHA512:
6
- metadata.gz: fa6c6886afc7595a4cdacd0fceeb1dc10aa5ad2edc0f440bcabe634ec1d35978acaee61eae509db8bfe56418d867bfed95a32a1f318362dd3377d6d3b9a5edba
7
- data.tar.gz: b233b667fe7e1942efb56bd8a0cf20162f46405f1ff5ab3bd41ddcf768e67064aa57b3934d8aa0fcc197188bc886ab6b596adb61498637da6c9cf4ad10fa2bb5
6
+ metadata.gz: 05e96b27be968770e656dddcd91e56969c6a4ec71b6deb38e50b352380fe1afed015de25f10e59ba55bb8181a8b39e3bcf65008be731fadb69c22f600e93d115
7
+ data.tar.gz: 699ebf6a150ff70284d6c3a81ccf2538d7f0965143d8efa253ed6925082ca9032da4e4b9e2c1679f19e2eed3029a7179cdd380a61eb10b8f4bef5e45d4eff3eb
@@ -3,18 +3,8 @@ module OptionalDepedencies
3
3
 
4
4
  def load_azure_blob_storage_dependencies
5
5
  azure_blob_storage_dependencies = {
6
- # 'faraday-excon' => '1.1.0',
7
- # 'faraday-net_http' => '1.0.1',
8
- # 'faraday-net_http_persistent' => '1.1.0',
9
- # 'ruby2_keywords' => '0.0.4',
10
- # 'faraday' => '1.4.1',
11
- # 'faraday_middleware' => '1.0.0',
12
- # 'connection_pool' => '2.2.5'
13
- # 'net-http-persistent' => '4.0.1',
14
- # 'racc' => '1.5.2',
15
- # 'nokogiri' => '1.11.4',
16
- 'azure/storage/common' => '2.0.2',
17
- 'azure/storage/blob' => '2.0.1',
6
+ 'azure/storage/common' => '>= 2.0.4',
7
+ 'azure/storage/blob' => '>= 2.0.3',
18
8
  }
19
9
  load_gem_list(azure_blob_storage_dependencies)
20
10
  end
@@ -25,6 +15,6 @@ module OptionalDepedencies
25
15
  require current_gem
26
16
  end
27
17
  rescue Gem::LoadError => e
28
- raise Gem::LoadError, "You are using functionality requiring the optional gem dependency '#{e.name}', but the gem is not loaded, or is not using a version matching '#{e.requirement}'."
18
+ raise Gem::LoadError, "You are using functionality requiring the optional gem dependency '#{e.name}', but the gem is not installed, or is not using a version matching '#{e.requirement}'.\n\n#{e.message}"
29
19
  end
30
20
  end
@@ -62,8 +62,10 @@ module SqlCmd
62
62
  EasyIO.logger.header 'AlwaysOn Permissions Migration to Replica'
63
63
  EasyIO.logger.debug 'Migrating logins to replica...'
64
64
  import_script_filename = SqlCmd.export_logins(start_time, primary_connection_string, database_name)
65
- EasyIO.logger.info "Importing logins on [#{SqlCmd.connection_string_part(replica_connection_string, :server)}]..."
66
- SqlCmd.execute_script_file(replica_connection_string, import_script_filename)
65
+ unless import_script_filename.nil?
66
+ EasyIO.logger.info "Importing logins on [#{SqlCmd.connection_string_part(replica_connection_string, :server)}]..."
67
+ SqlCmd.execute_script_file(replica_connection_string, import_script_filename)
68
+ end
67
69
  EasyIO.logger.debug 'Running database_status script...'
68
70
  database_info = SqlCmd::Database.info(connection_string, database_name)
69
71
  replica_database_info = SqlCmd::Database.info(replica_connection_string, database_name)
@@ -266,7 +268,7 @@ module SqlCmd
266
268
 
267
269
  def enabled?(connection_string)
268
270
  server_info = SqlCmd.get_sql_server_settings(connection_string)
269
- server_info['AvailabilityGroup'].nil? || server_info['SecondaryReplica'].nil?
271
+ !server_info['AvailabilityGroup'].nil? && !server_info['SecondaryReplica'].nil?
270
272
  end
271
273
  end
272
274
  end
@@ -137,7 +137,7 @@ module SqlCmd
137
137
  connection_string = SqlCmd.remove_connection_string_part(connection_string, :database)
138
138
  sql_server = SqlCmd.connection_string_part(connection_string, :server)
139
139
  database_info = info(connection_string, database_name)
140
- import_script_path = nil
140
+ import_script_path = import_security_script_path(start_time, connection_string, database_name, backup_url)
141
141
  unless database_info['DatabaseNotFound']
142
142
  raise "Failed to restore database: [#{database_name}] on [#{sql_server}]! Database already exists!" unless overwrite || force_restore
143
143
  unless options['logonly'] || database_info['state_desc'] != 'ONLINE' || permissions == :no_permissions
@@ -214,6 +214,8 @@ module SqlCmd
214
214
  raise "Insufficient free space on #{sql_server} to restore database! Must have greater than #{free_space_threshold}% space remaining after restore." if insufficient_space
215
215
  end
216
216
 
217
+ database_backup_types = %w(1 5)
218
+ drop(connection_string, database_name) if options['drop_before_restoring'] && !database_info['DatabaseNotFound'] && database_backup_types.include?(sql_backup_header['BackupType'])
217
219
  run_restore_as_job(connection_string, sql_server_settings, backup_files, database_name, options: options)
218
220
  monitor_restore(minimum_restore_date, connection_string, database_name, backup_files, options) unless asynchronous
219
221
  end
@@ -477,7 +479,7 @@ module SqlCmd
477
479
  end
478
480
  failure_message = 'Restore appears to have failed! '
479
481
  failure_message += job_status == 'NoJob' ? 'The job could not be found and the restored database is not up to date!' : "The job did not start in time. Check sql job 'Restore: #{database_name}' history on [#{server_name}] for details."
480
- raise failure_message + "Restore destination: #{server_name}\\#{database_name}"
482
+ raise failure_message + "\nRestore destination: #{server_name}\\#{database_name}"
481
483
  end
482
484
 
483
485
  def check_restore_date(start_time, connection_string, database_name, messages = :none, log_only: false)
@@ -535,7 +537,11 @@ module SqlCmd
535
537
  end
536
538
 
537
539
  def apply_recovery_model(connection_string, database_name, options)
538
- return if recovery_model_set?(connection_string, database_name, options)
540
+ if recovery_model_set?(connection_string, database_name, options)
541
+ EasyIO.logger.info "Recovery model already set to '#{options['recovery_model']}'. No change needed."
542
+ return
543
+ end
544
+ EasyIO.logger.info "Setting recovery model to '#{options['recovery_model']}'..."
539
545
  options['recovery_model'] ||= 'FULL'
540
546
  options['rollback'] ||= 'ROLLBACK IMMEDIATE' # other options: ROLLBACK AFTER 30, NO_WAIT
541
547
  sql_script = "ALTER DATABASE [#{database_name}] SET RECOVERY #{options['recovery_model']} WITH #{options['rollback']}"
@@ -547,6 +553,7 @@ module SqlCmd
547
553
  #{'=' * 120}\n"
548
554
  EOS
549
555
  raise failure_message unless recovery_model_set?(connection_string, database_name, options)
556
+ EasyIO.logger.info "Recovery model updated to '#{options['recovery_model']}'."
550
557
  end
551
558
 
552
559
  def recovery_model_set?(connection_string, database_name, options)
@@ -555,12 +562,19 @@ module SqlCmd
555
562
  SqlCmd.execute_query(connection_string, sql_script, return_type: :scalar, readonly: true) || false
556
563
  end
557
564
 
558
- def export_security(start_time, connection_string, database_name, storage_url = nil, options = {})
565
+ def import_security_script_path(start_time, connection_string, database_name, storage_url = nil)
559
566
  start_time = SqlCmd.unify_start_time(start_time)
560
567
  server_name = SqlCmd.connection_string_part(connection_string, :server)
561
568
  export_folder = "#{SqlCmd.config['paths']['cache']}/sql_cmd/logins"
562
569
  basename_prefix = storage_url.nil? ? "#{EasyFormat::File.windows_friendly_name(server_name)}_" : ''
563
570
  import_script_path = "#{export_folder}/#{basename_prefix}#{database_name}_database_permissions_#{EasyTime.yyyymmdd(start_time)}.sql"
571
+ end
572
+
573
+ def export_security(start_time, connection_string, database_name, storage_url = nil, options = {})
574
+ start_time = SqlCmd.unify_start_time(start_time)
575
+ server_name = SqlCmd.connection_string_part(connection_string, :server)
576
+ export_folder = "#{SqlCmd.config['paths']['cache']}/sql_cmd/logins"
577
+ import_script_path = import_security_script_path(start_time, connection_string, database_name, storage_url)
564
578
  if ::File.exist?(import_script_path) && ::File.mtime(import_script_path) > start_time
565
579
  content = ::File.read(import_script_path)
566
580
  SqlCmd::Azure::AttachedStorage.upload(::File.basename(import_script_path), content, options['storage_account_name'], options['storage_access_key'], storage_url: storage_url) unless storage_url.nil?
data/lib/sql_cmd/query.rb CHANGED
@@ -245,6 +245,7 @@ module SqlCmd
245
245
  def migrate_logins(start_time, source_connection_string, destination_connection_string, database_name)
246
246
  start_time = SqlCmd.unify_start_time(start_time)
247
247
  import_script_filename = export_logins(start_time, source_connection_string, database_name)
248
+ return if import_script_filename.nil?
248
249
  if ::File.exist?(import_script_filename)
249
250
  EasyIO.logger.info "Importing logins on [#{connection_string_part(destination_connection_string, :server)}]..."
250
251
  execute_script_file(destination_connection_string, import_script_filename)
@@ -6,7 +6,7 @@ SELECT
6
6
  j.name AS job_name,
7
7
  ja.start_execution_date,
8
8
  ISNULL(last_executed_step_id,0)+1 AS current_executed_step_id,
9
- Js.step_name
9
+ js.step_name
10
10
  FROM msdb.dbo.sysjobactivity ja
11
11
  LEFT JOIN msdb.dbo.sysjobhistory jh
12
12
  ON ja.job_history_id = jh.instance_id
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sql_cmd
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.3.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alex Munoz
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-04-22 00:00:00.000000000 Z
11
+ date: 2022-09-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: easy_json_config