activerecord-sqlserver-adapter-odbc-extended 8.0.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (102) hide show
  1. checksums.yaml +7 -0
  2. data/.github/issue_template.md +22 -0
  3. data/.github/workflows/ci.yml +32 -0
  4. data/.gitignore +9 -0
  5. data/.rubocop.yml +69 -0
  6. data/CHANGELOG.md +5 -0
  7. data/CODE_OF_CONDUCT.md +132 -0
  8. data/Dockerfile.ci +14 -0
  9. data/Gemfile +26 -0
  10. data/LICENSE.txt +21 -0
  11. data/README.md +104 -0
  12. data/RUNNING_UNIT_TESTS.md +38 -0
  13. data/Rakefile +45 -0
  14. data/VERSION +1 -0
  15. data/activerecord-sqlserver-adapter-odbc-extended.gemspec +34 -0
  16. data/compose.ci.yaml +15 -0
  17. data/lib/active_record/connection_adapters/extended_sqlserver_adapter.rb +204 -0
  18. data/lib/active_record/connection_adapters/sqlserver/core_ext/odbc.rb +41 -0
  19. data/lib/active_record/connection_adapters/sqlserver/odbc_database_statements.rb +234 -0
  20. data/lib/active_record/connection_adapters/sqlserver/type/binary_ext.rb +25 -0
  21. data/lib/activerecord-sqlserver-adapter-odbc-extended.rb +12 -0
  22. data/test/appveyor/dbsetup.ps1 +27 -0
  23. data/test/appveyor/dbsetup.sql +11 -0
  24. data/test/cases/active_schema_test_sqlserver.rb +127 -0
  25. data/test/cases/adapter_test_sqlserver.rb +648 -0
  26. data/test/cases/change_column_collation_test_sqlserver.rb +33 -0
  27. data/test/cases/change_column_null_test_sqlserver.rb +44 -0
  28. data/test/cases/coerced_tests.rb +2796 -0
  29. data/test/cases/column_test_sqlserver.rb +848 -0
  30. data/test/cases/connection_test_sqlserver.rb +138 -0
  31. data/test/cases/dbconsole.rb +19 -0
  32. data/test/cases/disconnected_test_sqlserver.rb +42 -0
  33. data/test/cases/eager_load_too_many_ids_test_sqlserver.rb +18 -0
  34. data/test/cases/enum_test_sqlserver.rb +49 -0
  35. data/test/cases/execute_procedure_test_sqlserver.rb +57 -0
  36. data/test/cases/fetch_test_sqlserver.rb +88 -0
  37. data/test/cases/fully_qualified_identifier_test_sqlserver.rb +72 -0
  38. data/test/cases/helper_sqlserver.rb +61 -0
  39. data/test/cases/migration_test_sqlserver.rb +144 -0
  40. data/test/cases/order_test_sqlserver.rb +153 -0
  41. data/test/cases/pessimistic_locking_test_sqlserver.rb +102 -0
  42. data/test/cases/primary_keys_test_sqlserver.rb +103 -0
  43. data/test/cases/rake_test_sqlserver.rb +198 -0
  44. data/test/cases/schema_dumper_test_sqlserver.rb +296 -0
  45. data/test/cases/schema_test_sqlserver.rb +111 -0
  46. data/test/cases/trigger_test_sqlserver.rb +51 -0
  47. data/test/cases/utils_test_sqlserver.rb +129 -0
  48. data/test/cases/uuid_test_sqlserver.rb +54 -0
  49. data/test/cases/view_test_sqlserver.rb +58 -0
  50. data/test/config.yml +38 -0
  51. data/test/debug.rb +16 -0
  52. data/test/fixtures/1px.gif +0 -0
  53. data/test/migrations/create_clients_and_change_column_collation.rb +19 -0
  54. data/test/migrations/create_clients_and_change_column_null.rb +25 -0
  55. data/test/migrations/transaction_table/1_table_will_never_be_created.rb +11 -0
  56. data/test/models/sqlserver/alien.rb +5 -0
  57. data/test/models/sqlserver/booking.rb +5 -0
  58. data/test/models/sqlserver/composite_pk.rb +9 -0
  59. data/test/models/sqlserver/customers_view.rb +5 -0
  60. data/test/models/sqlserver/datatype.rb +5 -0
  61. data/test/models/sqlserver/datatype_migration.rb +10 -0
  62. data/test/models/sqlserver/dollar_table_name.rb +5 -0
  63. data/test/models/sqlserver/edge_schema.rb +13 -0
  64. data/test/models/sqlserver/fk_has_fk.rb +5 -0
  65. data/test/models/sqlserver/fk_has_pk.rb +5 -0
  66. data/test/models/sqlserver/natural_pk_data.rb +6 -0
  67. data/test/models/sqlserver/natural_pk_int_data.rb +5 -0
  68. data/test/models/sqlserver/no_pk_data.rb +5 -0
  69. data/test/models/sqlserver/object_default.rb +5 -0
  70. data/test/models/sqlserver/quoted_table.rb +9 -0
  71. data/test/models/sqlserver/quoted_view_1.rb +5 -0
  72. data/test/models/sqlserver/quoted_view_2.rb +5 -0
  73. data/test/models/sqlserver/sst_memory.rb +5 -0
  74. data/test/models/sqlserver/sst_string_collation.rb +3 -0
  75. data/test/models/sqlserver/string_default.rb +5 -0
  76. data/test/models/sqlserver/string_defaults_big_view.rb +5 -0
  77. data/test/models/sqlserver/string_defaults_view.rb +5 -0
  78. data/test/models/sqlserver/table_with_spaces.rb +5 -0
  79. data/test/models/sqlserver/tinyint_pk.rb +5 -0
  80. data/test/models/sqlserver/trigger.rb +17 -0
  81. data/test/models/sqlserver/trigger_history.rb +5 -0
  82. data/test/models/sqlserver/upper.rb +5 -0
  83. data/test/models/sqlserver/uppered.rb +5 -0
  84. data/test/models/sqlserver/uuid.rb +5 -0
  85. data/test/schema/datatypes/2012.sql +56 -0
  86. data/test/schema/enable-in-memory-oltp.sql +81 -0
  87. data/test/schema/sqlserver_specific_schema.rb +363 -0
  88. data/test/support/coerceable_test_sqlserver.rb +55 -0
  89. data/test/support/connection_reflection.rb +32 -0
  90. data/test/support/core_ext/query_cache.rb +38 -0
  91. data/test/support/load_schema_sqlserver.rb +29 -0
  92. data/test/support/marshal_compatibility_fixtures/SQLServer/rails_6_1_topic.dump +0 -0
  93. data/test/support/marshal_compatibility_fixtures/SQLServer/rails_6_1_topic_associations.dump +0 -0
  94. data/test/support/marshal_compatibility_fixtures/SQLServer/rails_7_1_topic.dump +0 -0
  95. data/test/support/marshal_compatibility_fixtures/SQLServer/rails_7_1_topic_associations.dump +0 -0
  96. data/test/support/minitest_sqlserver.rb +3 -0
  97. data/test/support/paths_sqlserver.rb +50 -0
  98. data/test/support/query_assertions.rb +49 -0
  99. data/test/support/rake_helpers.rb +46 -0
  100. data/test/support/table_definition_sqlserver.rb +24 -0
  101. data/test/support/test_in_memory_oltp.rb +17 -0
  102. metadata +240 -0
@@ -0,0 +1,58 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "cases/helper_sqlserver"
4
+
5
+ class ViewTestSQLServer < ActiveRecord::TestCase
6
+ let(:connection) { ActiveRecord::Base.lease_connection }
7
+
8
+ describe 'view with default values' do
9
+ before do
10
+ connection.drop_table :view_casing_table rescue nil
11
+ connection.create_table :view_casing_table, force: true do |t|
12
+ t.boolean :Default_Falsey, null: false, default: false
13
+ t.boolean :Default_Truthy, null: false, default: true
14
+ t.string :default_string_null, null: true, default: nil
15
+ t.string :default_string, null: false, default: "abc"
16
+ end
17
+
18
+ connection.execute("DROP VIEW IF EXISTS view_casing_table_view;")
19
+ connection.execute <<-SQL
20
+ CREATE VIEW view_casing_table_view AS
21
+ SELECT id AS id,
22
+ default_falsey AS falsey,
23
+ default_truthy AS truthy,
24
+ default_string_null AS s_null,
25
+ default_string AS s
26
+ FROM view_casing_table
27
+ SQL
28
+ end
29
+
30
+ it "default values are correct when column casing used in tables and views are different" do
31
+ klass = Class.new(ActiveRecord::Base) do
32
+ self.table_name = "view_casing_table_view"
33
+ end
34
+
35
+ obj = klass.new
36
+ assert_equal false, obj.falsey
37
+ assert_equal true, obj.truthy
38
+ assert_equal "abc", obj.s
39
+ assert_nil obj.s_null
40
+ assert_equal 0, klass.count
41
+
42
+ obj.save!
43
+ assert_equal false, obj.falsey
44
+ assert_equal true, obj.truthy
45
+ assert_equal "abc", obj.s
46
+ assert_nil obj.s_null
47
+ assert_equal 1, klass.count
48
+ end
49
+ end
50
+
51
+ describe 'identity insert' do
52
+ it "identity insert works with views" do
53
+ assert_difference("SSTestCustomersView.count", 1) do
54
+ SSTestCustomersView.create!(id: 5, name: "Bob")
55
+ end
56
+ end
57
+ end
58
+ end
data/test/config.yml ADDED
@@ -0,0 +1,38 @@
1
+
2
+ default_connection_info: &default_connection_info
3
+ adapter: sqlserver
4
+ host: <%= ENV['ACTIVERECORD_UNITTEST_HOST'] || 'localhost' %>
5
+ port: <%= ENV['ACTIVERECORD_UNITTEST_PORT'] %>
6
+ database: activerecord_unittest
7
+ username: <%= ENV['ACTIVERECORD_UNITTEST_USER'] || 'rails' %>
8
+ password: <%= ENV['ACTIVERECORD_UNITTEST_PASS'] || '' %>
9
+ collation: <%= ENV['ACTIVERECORD_UNITTEST_COLLATION'] || nil %>
10
+ encoding: utf8
11
+
12
+ connections:
13
+
14
+ dblib:
15
+ arunit:
16
+ <<: *default_connection_info
17
+ appname: SQLServerAdptrUnit
18
+ dataserver: <%= ENV['ACTIVERECORD_UNITTEST_DATASERVER'] %>
19
+ tds_version: <%= ENV['ACTIVERECORD_UNITTEST_TDSVERSION'] %>
20
+ azure: <%= !ENV['ACTIVERECORD_UNITTEST_AZURE'].nil? %>
21
+ timeout: <%= ENV['ACTIVERECORD_UNITTEST_AZURE'].present? ? 20 : 10 %>
22
+ arunit2:
23
+ <<: *default_connection_info
24
+ database: activerecord_unittest2
25
+ appname: SQLServerAdptrUnit2
26
+ dataserver: <%= ENV['ACTIVERECORD_UNITTEST_DATASERVER'] %>
27
+ tds_version: <%= ENV['ACTIVERECORD_UNITTEST_TDSVERSION'] %>
28
+ azure: <%= !ENV['ACTIVERECORD_UNITTEST_AZURE'].nil? %>
29
+ timeout: <%= ENV['ACTIVERECORD_UNITTEST_AZURE'].present? ? 20 : 10 %>
30
+
31
+ odbc:
32
+ arunit:
33
+ <<: *default_connection_info
34
+ dsn: <%= ENV['ACTIVERECORD_UNITTEST_DSN'] || 'activerecord_unittest' %>
35
+ arunit2:
36
+ <<: *default_connection_info
37
+ database: activerecord_unittest2
38
+ dsn: <%= ENV['ACTIVERECORD_UNITTEST2_DSN'] || 'activerecord_unittest2' %>
data/test/debug.rb ADDED
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ # require 'rails/all'
4
+ require "tiny_tds"
5
+
6
+ c = TinyTds::Client.new(
7
+ host: ENV["CI_AZURE_HOST"],
8
+ username: "rails",
9
+ password: ENV["CI_AZURE_PASS"],
10
+ database: "activerecord_unittest",
11
+ azure: true,
12
+ tds_version: "7.3"
13
+ )
14
+
15
+ puts c.execute("SELECT 1 AS [one]").each
16
+ c.close
Binary file
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ class CreateClientsAndChangeColumnCollation < ActiveRecord::Migration[5.2]
4
+ def up
5
+ create_table :clients do |t|
6
+ t.string :name
7
+ t.string :code, collation: :SQL_Latin1_General_CP1_CS_AS
8
+
9
+ t.timestamps
10
+ end
11
+
12
+ change_column :clients, :name, :string, collation: 'SQL_Latin1_General_CP1_CS_AS'
13
+ change_column :clients, :code, :string, collation: 'SQL_Latin1_General_CP1_CI_AS'
14
+ end
15
+
16
+ def down
17
+ drop_table :clients
18
+ end
19
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ class CreateClientsAndChangeColumnNull < ActiveRecord::Migration[5.2]
4
+ def up
5
+ create_table :clients do |t|
6
+ t.string :name
7
+ t.string :code
8
+ t.decimal :value
9
+
10
+ t.timestamps
11
+ end
12
+
13
+ change_column :clients, :name, :string, limit: 15
14
+ change_column :clients, :code, :string, default: "n/a"
15
+ change_column :clients, :value, :decimal, precision: 32, scale: 8
16
+
17
+ change_column_null :clients, :name, false
18
+ change_column_null :clients, :code, false
19
+ change_column_null :clients, :value, false
20
+ end
21
+
22
+ def down
23
+ drop_table :clients
24
+ end
25
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ class TableWillNeverBeCreated < ActiveRecord::Migration[5.2]
4
+ def self.up
5
+ create_table(:sqlserver_trans_table1) {}
6
+ create_table(:sqlserver_trans_table2) { raise("HELL") }
7
+ end
8
+
9
+ def self.down
10
+ end
11
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Alien < ActiveRecord::Base
4
+ self.table_name = "test.aliens"
5
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ class SSTestBooking < ActiveRecord::Base
4
+ self.table_name = "sst_bookings"
5
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ class SSCompositePkWithoutIdentity < ActiveRecord::Base
4
+ self.table_name = :sst_composite_without_identity
5
+ end
6
+
7
+ class SSCompositePkWithIdentity < ActiveRecord::Base
8
+ self.table_name = :sst_composite_with_identity
9
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ class SSTestCustomersView < ActiveRecord::Base
4
+ self.table_name = "sst_customers_view"
5
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ class SSTestDatatype < ActiveRecord::Base
4
+ self.table_name = :sst_datatypes
5
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ class SSTestDatatypeMigration < ActiveRecord::Base
4
+ self.table_name = :sst_datatypes_migration
5
+ end
6
+
7
+ class SSTestDatatypeMigrationJson < ActiveRecord::Base
8
+ self.table_name = :sst_datatypes_migration
9
+ attribute :json_col, ActiveRecord::Type::SQLServer::Json.new
10
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ class SSTestDollarTableName < ActiveRecord::Base
4
+ self.table_name = "sst_my$strange_table"
5
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ class SSTestEdgeSchema < ActiveRecord::Base
4
+ self.table_name = "sst_edge_schemas"
5
+
6
+ def with_spaces
7
+ read_attribute :'with spaces'
8
+ end
9
+
10
+ def with_spaces=(value)
11
+ write_attribute :'with spaces', value
12
+ end
13
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ class SSTestHasFk < ActiveRecord::Base
4
+ self.table_name = "sst_has_fks"
5
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ class SSTestHasPk < ActiveRecord::Base
4
+ self.table_name = "sst_has_pks"
5
+ end
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ class SSTestNaturalPkData < ActiveRecord::Base
4
+ self.table_name = "sst_natural_pk_data"
5
+ self.primary_key = "legacy_id"
6
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ class SSTestNaturalPkIntData < ActiveRecord::Base
4
+ self.table_name = "sst_natural_pk_int_data"
5
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ class SSTestNoPkData < ActiveRecord::Base
4
+ self.table_name = "sst_no_pk_data"
5
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ class SSTestObjectDefault < ActiveRecord::Base
4
+ self.table_name = "sst_defaultobjects"
5
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ class SSTestQuotedTable < ActiveRecord::Base
4
+ self.table_name = "[sst_quoted-table]"
5
+ end
6
+
7
+ class SSTestQuotedTableUser < ActiveRecord::Base
8
+ self.table_name = "[dbo].[sst_quoted-table]"
9
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ class SSTestQuotedView1 < ActiveRecord::Base
4
+ self.table_name = "sst_quoted-view1"
5
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ class SSTestQuotedView2 < ActiveRecord::Base
4
+ self.table_name = "sst_quoted-view2"
5
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ class SSTMemory < ActiveRecord::Base
4
+ self.table_name = "sst_memory"
5
+ end
@@ -0,0 +1,3 @@
1
+ class SstStringCollation < ActiveRecord::Base
2
+ self.table_name = "sst_string_collation"
3
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ class SSTestStringDefault < ActiveRecord::Base
4
+ self.table_name = "sst_string_defaults"
5
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ class SSTestStringDefaultsBigView < ActiveRecord::Base
4
+ self.table_name = "sst_string_defaults_big_view"
5
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ class SSTestStringDefaultsView < ActiveRecord::Base
4
+ self.table_name = "sst_string_defaults_view"
5
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ class TableWithSpaces < ActiveRecord::Base
4
+ self.table_name = "A Table With Spaces"
5
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ class SSTestTinyintPk < ActiveRecord::Base
4
+ self.table_name = "sst_tinyint_pk"
5
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ class SSTestTrigger < ActiveRecord::Base
4
+ self.table_name = "sst_table_with_trigger"
5
+ end
6
+
7
+ class SSTestTriggerUuid < ActiveRecord::Base
8
+ self.table_name = "sst_table_with_uuid_trigger"
9
+ end
10
+
11
+ class SSTestTriggerCompositePk < ActiveRecord::Base
12
+ self.table_name = "sst_table_with_composite_pk_trigger"
13
+ end
14
+
15
+ class SSTestTriggerCompositePkWithDefferentDataType < ActiveRecord::Base
16
+ self.table_name = "sst_table_with_composite_pk_trigger_with_different_data_type"
17
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ class SSTestTriggerHistory < ActiveRecord::Base
4
+ self.table_name = "sst_table_with_trigger_history"
5
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ class SSTestUpper < ActiveRecord::Base
4
+ self.table_name = "sst_upper_tests"
5
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ class SSTestUppered < ActiveRecord::Base
4
+ self.table_name = "SST_UPPER_TESTS"
5
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ class SSTestUuid < ActiveRecord::Base
4
+ self.table_name = "sst_uuids"
5
+ end
@@ -0,0 +1,56 @@
1
+
2
+ IF EXISTS (
3
+ SELECT TABLE_NAME
4
+ FROM INFORMATION_SCHEMA.TABLES
5
+ WHERE TABLE_NAME = N'sst_datatypes'
6
+ ) DROP TABLE [sst_datatypes]
7
+
8
+ CREATE TABLE [sst_datatypes] (
9
+ -- Exact Numerics
10
+ [id] [int] NOT NULL IDENTITY(1,1) PRIMARY KEY,
11
+ [bigint] [bigint] NULL DEFAULT 42,
12
+ [int] [int] NULL DEFAULT 42,
13
+ [smallint] [smallint] NULL DEFAULT 42,
14
+ [tinyint] [tinyint] NULL DEFAULT 42,
15
+ [bit] [bit] NULL DEFAULT 1,
16
+ [decimal_9_2] [decimal](9, 2) NULL DEFAULT 12345.01,
17
+ [decimal_16_4] [decimal](16, 4) NULL DEFAULT 1234567.89,
18
+ [numeric_18_0] [numeric](18, 0) NULL DEFAULT 191,
19
+ [numeric_36_2] [numeric](36, 2) NULL DEFAULT 12345678901234567890.01,
20
+ [money] [money] NULL DEFAULT 4.20,
21
+ [smallmoney] [smallmoney] NULL DEFAULT 4.20,
22
+ -- Approximate Numerics
23
+ [float] [float] NULL DEFAULT 123.00000001,
24
+ [real] [real] NULL DEFAULT 123.45,
25
+ -- Date and Time
26
+ [date] [date] NULL DEFAULT '1900-01-01',
27
+ [datetime] [datetime] NULL DEFAULT '1753-01-01T00:00:00.123',
28
+ [datetime2_7] [datetime2](7) NULL DEFAULT '9999-12-31 23:59:59.9999999',
29
+ [datetime2_3] [datetime2](3) NULL,
30
+ [datetime2_1] [datetime2](1) NULL,
31
+ [datetime2_0] [datetime2](0) NULL,
32
+ [datetimeoffset_7] [datetimeoffset](7) NULL DEFAULT '1984-01-24 04:20:00.1234567 -08:00',
33
+ [datetimeoffset_3] [datetimeoffset](3) NULL,
34
+ [datetimeoffset_1] [datetimeoffset](1) NULL,
35
+ [smalldatetime] [smalldatetime] NULL DEFAULT '1901-01-01T15:45:00.000Z',
36
+ [time_7] [time](7) NULL DEFAULT '04:20:00.2883215',
37
+ [time_2] [time](2) NULL,
38
+ [time_default] [time] NULL DEFAULT '15:03:42.0621978',
39
+ -- Character Strings
40
+ [char_10] [char](10) NULL DEFAULT '1234567890',
41
+ [varchar_50] [varchar](50) NULL DEFAULT 'test varchar_50',
42
+ [varchar_max] [varchar](max) NULL DEFAULT 'test varchar_max',
43
+ [text] [text] NULL DEFAULT 'test text',
44
+ -- Unicode Character Strings
45
+ [nchar_10] [nchar](10) NULL DEFAULT N'12345678åå',
46
+ [nvarchar_50] [nvarchar](50) NULL DEFAULT N'test nvarchar_50 åå',
47
+ [nvarchar_max] [nvarchar](max) NULL DEFAULT N'test nvarchar_max åå',
48
+ [ntext] [ntext] NULL DEFAULT N'test ntext åå',
49
+ -- Binary Strings
50
+ [binary_49] [binary](49) NULL,
51
+ [varbinary_49] [varbinary](49) NULL,
52
+ [varbinary_max] [varbinary](max) NULL,
53
+ -- Other Data Types
54
+ [uniqueidentifier] [uniqueidentifier] NULL DEFAULT NEWID(),
55
+ [timestamp] [timestamp] NULL,
56
+ ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
@@ -0,0 +1,81 @@
1
+ -- https://msdn.microsoft.com/en-us/library/mt694156.aspx
2
+ -- https://raw.githubusercontent.com/Microsoft/sql-server-samples/master/samples/features/in-memory/t-sql-scripts/enable-in-memory-oltp.sql
3
+ --
4
+ -- The below scipt enables the use of In-Memory OLTP in the current database,
5
+ -- provided it is supported in the edition / pricing tier of the database.
6
+ -- It does the following:
7
+ -- 1. Validate that In-Memory OLTP is supported.
8
+ -- 2. In SQL Server, it will add a MEMORY_OPTIMIZED_DATA filegroup to the database
9
+ -- and create a container within the filegroup in the default data folder.
10
+ -- 3. Change the database compatibility level to 130 (needed for parallel queries
11
+ -- and auto-update of statistics).
12
+ -- 4. Enables the database option MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT to avoid the
13
+ -- need to use the WITH (SNAPSHOT) hint for ad hoc queries accessing memory-optimized
14
+ -- tables.
15
+ --
16
+ -- Applies To: SQL Server 2016 (or higher); Azure SQL Database
17
+ -- Author: Jos de Bruijn (Microsoft)
18
+ -- Last Updated: 2016-05-02
19
+
20
+ SET NOCOUNT ON;
21
+ SET XACT_ABORT ON;
22
+
23
+ -- 1. validate that In-Memory OLTP is supported
24
+ IF SERVERPROPERTY(N'IsXTPSupported') = 0
25
+ BEGIN
26
+ PRINT N'Error: In-Memory OLTP is not supported for this server edition or database pricing tier.';
27
+ END
28
+ IF DB_ID() < 5
29
+ BEGIN
30
+ PRINT N'Error: In-Memory OLTP is not supported in system databases. Connect to a user database.';
31
+ END
32
+ ELSE
33
+ BEGIN
34
+ BEGIN TRY;
35
+ -- 2. add MEMORY_OPTIMIZED_DATA filegroup when not using Azure SQL DB
36
+ IF SERVERPROPERTY('EngineEdition') != 5
37
+ BEGIN
38
+ DECLARE @SQLDataFolder nvarchar(max) = cast(SERVERPROPERTY('InstanceDefaultDataPath') as nvarchar(max))
39
+ DECLARE @MODName nvarchar(max) = DB_NAME() + N'_mod';
40
+ DECLARE @MemoryOptimizedFilegroupFolder nvarchar(max) = @SQLDataFolder + @MODName;
41
+
42
+ DECLARE @SQL nvarchar(max) = N'';
43
+
44
+ -- add filegroup
45
+ IF NOT EXISTS (SELECT 1 FROM sys.filegroups WHERE type = N'FX')
46
+ BEGIN
47
+ SET @SQL = N'
48
+ ALTER DATABASE CURRENT
49
+ ADD FILEGROUP ' + QUOTENAME(@MODName) + N' CONTAINS MEMORY_OPTIMIZED_DATA;';
50
+ EXECUTE (@SQL);
51
+
52
+ END;
53
+
54
+ -- add container in the filegroup
55
+ IF NOT EXISTS (SELECT * FROM sys.database_files WHERE data_space_id IN (SELECT data_space_id FROM sys.filegroups WHERE type = N'FX'))
56
+ BEGIN
57
+ SET @SQL = N'
58
+ ALTER DATABASE CURRENT
59
+ ADD FILE (name = N''' + @MODName + ''', filename = '''
60
+ + @MemoryOptimizedFilegroupFolder + N''')
61
+ TO FILEGROUP ' + QUOTENAME(@MODName);
62
+ EXECUTE (@SQL);
63
+ END
64
+ END
65
+
66
+ -- 3. set compat level to 130 if it is lower
67
+ IF (SELECT compatibility_level FROM sys.databases WHERE database_id=DB_ID()) < 130
68
+ ALTER DATABASE CURRENT SET COMPATIBILITY_LEVEL = 130
69
+
70
+ -- 4. enable MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT for the database
71
+ ALTER DATABASE CURRENT SET MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT = ON;
72
+
73
+
74
+ END TRY
75
+ BEGIN CATCH
76
+ PRINT N'Error enabling In-Memory OLTP';
77
+ IF XACT_STATE() != 0
78
+ ROLLBACK;
79
+ THROW;
80
+ END CATCH;
81
+ END;