Skip to content

Commit 28297e3

Browse files
committed
Add support for #disable_referential_integrity block.
1 parent fbaf023 commit 28297e3

File tree

4 files changed

+48
-2
lines changed

4 files changed

+48
-2
lines changed

lib/active_record/connection_adapters/sqlserver_adapter.rb

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -364,10 +364,14 @@ def quoted_date(value)
364364
end
365365
end
366366

367-
368367
# REFERENTIAL INTEGRITY ====================================#
369-
# TODO: Add #disable_referential_integrity if we can use it
370368

369+
def disable_referential_integrity(&block)
370+
execute "EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'"
371+
yield
372+
ensure
373+
execute "EXEC sp_MSForEachTable 'ALTER TABLE ? CHECK CONSTRAINT ALL'"
374+
end
371375

372376
# DATABASE STATEMENTS ======================================
373377

test/cases/adapter_test_sqlserver.rb

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,32 @@ def setup
189189

190190
end
191191

192+
context 'When disableing referential integrity' do
193+
194+
setup do
195+
@parent = FkTestHasPk.create!
196+
@member = FkTestHasFk.create!(:fk_id => @parent.id)
197+
end
198+
199+
should 'NOT ALLOW by default the deletion of a referenced parent' do
200+
assert_raise(ActiveRecord::StatementInvalid) { @parent.destroy }
201+
end
202+
203+
should 'ALLOW deletion of referenced parent using #disable_referential_integrity block' do
204+
assert_nothing_raised(ActiveRecord::StatementInvalid) do
205+
FkTestHasPk.connection.disable_referential_integrity { @parent.destroy }
206+
end
207+
end
208+
209+
should 'again NOT ALLOW deletion of referenced parent after #disable_referential_integrity block' do
210+
assert_raise(ActiveRecord::StatementInvalid) do
211+
FkTestHasPk.connection.disable_referential_integrity { }
212+
@parent.destroy
213+
end
214+
end
215+
216+
end
217+
192218
context 'For DatabaseStatements' do
193219

194220
end

test/cases/sqlserver_helper.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313
ActiveRecord::Migration.verbose = false
1414

1515
class TableWithRealColumn < ActiveRecord::Base; end
16+
class FkTestHasFk < ActiveRecord::Base ; end
17+
class FkTestHasPk < ActiveRecord::Base ; end
1618

1719
# Change the text database type to support ActiveRecord's tests for = on text columns which
1820
# is not supported in SQL Server text columns, so use varchar(8000) instead.

test/schema/sqlserver_specific_schema.rb

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,4 +29,18 @@
2929
t.column :string_with_pretend_null_four, :string, :default => '(NULL)'
3030
end
3131

32+
33+
create_table :fk_test_has_fks, :force => true do |t|
34+
t.integer :fk_id, :null => false
35+
end
36+
create_table :fk_test_has_pks, :force => true do |t|
37+
end
38+
execute <<-ADDFKSQL
39+
ALTER TABLE fk_test_has_fks
40+
ADD CONSTRAINT FK__fk_test_has_fk_fk_id
41+
FOREIGN KEY (#{quote_column_name('fk_id')})
42+
REFERENCES #{quote_table_name('fk_test_has_pks')} (#{quote_column_name('id')})
43+
ADDFKSQL
44+
45+
3246
end

0 commit comments

Comments
 (0)