Module: Foreigner::ConnectionAdapters::SqlserverAdapter

Includes:
Sql2003
Defined in:
lib/foreigner/connection_adapters/sqlserver_adapter.rb

Instance Method Summary collapse

Methods included from Sql2003

#add_foreign_key, #supports_foreign_keys?

Instance Method Details

#add_primary_key(table, options) ⇒ Object



15
16
17
18
# File 'lib/foreigner/connection_adapters/sqlserver_adapter.rb', line 15

def add_primary_key(table,options)
  constraint_name = "pk_#{table}_#{options[:column]}"
  execute "alter table #{table} add constraint #{constraint_name} primary key (#{options[:column]})"
end

#foreign_keys(table_name) ⇒ Object



42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
# File 'lib/foreigner/connection_adapters/sqlserver_adapter.rb', line 42

def foreign_keys(table_name)
  fk_info = select_all %{
    SELECT
        'column' = CU.COLUMN_NAME,
        to_table  = PK.TABLE_NAME,
        primary_key = PT.COLUMN_NAME,
        'name' = C.CONSTRAINT_NAME
    FROM
        INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS C
        INNER JOIN
        INFORMATION_SCHEMA.TABLE_CONSTRAINTS FK
            ON C.CONSTRAINT_NAME = FK.CONSTRAINT_NAME
        INNER JOIN
        INFORMATION_SCHEMA.TABLE_CONSTRAINTS PK
            ON C.UNIQUE_CONSTRAINT_NAME = PK.CONSTRAINT_NAME
        INNER JOIN
        INFORMATION_SCHEMA.KEY_COLUMN_USAGE CU
            ON C.CONSTRAINT_NAME = CU.CONSTRAINT_NAME
        INNER JOIN
        (
            SELECT
                i1.TABLE_NAME, i2.COLUMN_NAME
            FROM
                INFORMATION_SCHEMA.TABLE_CONSTRAINTS i1
                INNER JOIN
                INFORMATION_SCHEMA.KEY_COLUMN_USAGE i2
                ON i1.CONSTRAINT_NAME = i2.CONSTRAINT_NAME
                WHERE i1.CONSTRAINT_TYPE = 'PRIMARY KEY'
        ) PT ON PT.TABLE_NAME = PK.TABLE_NAME
        WHERE FK.TABLE_NAME= '#{table_name}'
  }

  fk_info.map do |row|
    options = {:column => row['column'], :name => row['name'], :primary_key => row['primary_key']}
    ForeignKeyDefinition.new(table_name, row['to_table'], options)
  end
end

#pk(table_name) ⇒ Object



26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/foreigner/connection_adapters/sqlserver_adapter.rb', line 26

def pk(table_name)
  pk_info = select_all %{
    select 	c.COLUMN_NAME as 'pk'
      from 	INFORMATION_SCHEMA.TABLE_CONSTRAINTS pk ,
      INFORMATION_SCHEMA.KEY_COLUMN_USAGE c
    where 	pk.TABLE_NAME = '#{table_name}'
      and	CONSTRAINT_TYPE = 'PRIMARY KEY'
      and	c.TABLE_NAME = pk.TABLE_NAME
      and	c.CONSTRAINT_NAME = pk.CONSTRAINT_NAME
  }
  pk_info.map do |row|
    options = {:pk => row['pk']}
    options
  end
end

#remove_foreign_key(table, options) ⇒ Object



6
7
8
9
10
11
12
13
# File 'lib/foreigner/connection_adapters/sqlserver_adapter.rb', line 6

def remove_foreign_key(table, options)
  if Hash === options
    foreign_key_name = foreign_key_name(table, options[:column], options)
  else
    foreign_key_name = foreign_key_name(table, "#{options.to_s.singularize}_id")
  end
  execute "IF EXISTS (SELECT 1 from sys.objects where name = '#{foreign_key_name}') ALTER TABLE #{table} DROP CONSTRAINT #{foreign_key_name}"
end

#remove_primary_key(table, options) ⇒ Object



20
21
22
23
# File 'lib/foreigner/connection_adapters/sqlserver_adapter.rb', line 20

def remove_primary_key(table, options)
  constraint_name = "pk_#{table}_#{options[:column]}"
  execute "alter table #{table} drop constraint #{constraint_name}"
end