module Foreigner::ConnectionAdapters::SQLServerAdapter

Public Instance Methods

foreign_keys(table_name) click to toggle source
# File lib/foreigner/connection_adapters/sqlserver_adapter.rb, line 6
def foreign_keys(table_name)
  # Called from schema_dump
  fk_info = select_all %{
    SELECT  to_table.name AS to_table,
            -- from_table.name AS from_table,
            from_column.name AS from_column,
            to_column.name AS primary_key,
            foreign_key.name AS name,
            OBJECTPROPERTY(foreign_key.id,'CnstIsUpdateCascade') as update_is_cascade,
            OBJECTPROPERTY(foreign_key.id,'CnstIsDeleteCascade') as delete_is_cascade
    FROM    sysobjects AS from_table,
            sysforeignkeys AS f,
            sysobjects AS to_table,
            sysobjects AS foreign_key,
            syscolumns AS from_column,
            syscolumns AS to_column
    WHERE   from_table.type = 'U'
      AND   from_table.id = f.fkeyid
      AND   f.constid = foreign_key.id
      AND   f.rkeyid = to_table.id
      AND   f.fkey = from_column.colid
      AND   from_column.id = from_table.id
      AND   f.rkey = to_column.colid
      AND   to_column.id = to_table.id
      AND   from_table.name = '#{table_name}'
    ORDER BY from_table.name, to_table.name, foreign_key.name, from_column.name
  }

  fk_info.map do |row|
    options = {:column => row['from_column'], :name => row['name'], :primary_key => row['primary_key']}

    options[:dependent] =
      if row['delete_is_cascade']
        if row['update_is_cascade']
          :cascade
        else
          :delete
        end
      else
        :restrict
      end
      # Don't know how to extract ON DELETE DEFAULT, ON DELETE SET NULL

    ForeignKeyDefinition.new(table_name, row['to_table'], options)
  end
end