Class: Mkxms::Mssql::AdoptionScriptWriter::TableTypeKeyConstraintChecks

Inherits:
IndentedStringBuilder show all
Extended by:
SqlStringManipulators
Includes:
SqlStringManipulators
Defined in:
lib/mkxms/mssql/adoption_script_writer.rb

Constant Summary

Constants included from SqlStringManipulators

SqlStringManipulators::MSSQL

Constants inherited from IndentedStringBuilder

IndentedStringBuilder::NAMED_SUBSTITUTIONS

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from SqlStringManipulators

bit_test, boolean_desc, dedent, stresc, strlit, unquoted_identifier

Methods inherited from IndentedStringBuilder

dsl, #dsl, #each, #indented, #puts, #to_s

Constructor Details

#initialize(table, constraint, error_sql_proc) ⇒ TableTypeKeyConstraintChecks

Returns a new instance of TableTypeKeyConstraintChecks.



337
338
339
340
341
342
343
344
345
# File 'lib/mkxms/mssql/adoption_script_writer.rb', line 337

def initialize(table, constraint, error_sql_proc)
  super()
  
  @table = table
  @constraint = constraint
  @error_sql_proc = error_sql_proc
  
  add_tests
end

Instance Attribute Details

#constraintObject (readonly)

Returns the value of attribute constraint.



347
348
349
# File 'lib/mkxms/mssql/adoption_script_writer.rb', line 347

def constraint
  @constraint
end

#tableObject (readonly)

Returns the value of attribute table.



347
348
349
# File 'lib/mkxms/mssql/adoption_script_writer.rb', line 347

def table
  @table
end

Instance Method Details

#add_testsObject



353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
# File 'lib/mkxms/mssql/adoption_script_writer.rb', line 353

def add_tests
  dsl {
    puts "IF NOT EXISTS(%s)" do
      puts dedent %Q{
        SELECT * FROM sys.key_constraints kc
        JOIN sys.table_types tt ON tt.type_table_object_id = kc.parent_object_id
        WHERE tt.user_type_id = TYPE_ID(#{table.qualified_name.sql_quoted})
        AND kc.type = #{
          case constraint.type
          when 'PRIMARY KEY' then 'PK'
          when 'UNIQUE' then 'UQ'
          else raise "Unknown key constraint type"
          end.sql_quoted
        }
      }
      constraint.columns.each_with_index do |col, i|
        puts dedent %Q{
          AND (
            SELECT ic.key_ordinal
            FROM sys.index_columns ic
            JOIN sys.columns c
              ON c.object_id = ic.object_id
              AND c.column_id = ic.column_id
            WHERE ic.object_id = kc.parent_object_id
            AND ic.index_id = kc.unique_index_id
            AND QUOTENAME(c.name) = #{col.name.sql_quoted}
          ) = #{i + 1}
        }
      end
    end
    puts "BEGIN"..."END" do
      puts error_sql "Table type #{table.qualified_name} does not have a #{constraint.type} constraint with the expected sequence of columns (#{constraint.columns.map(&:name).join(', ')})."
    end
  }
end

#error_sql(s) ⇒ Object



349
350
351
# File 'lib/mkxms/mssql/adoption_script_writer.rb', line 349

def error_sql(s)
  @error_sql_proc.call(s)
end