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.
- checksums.yaml +7 -0
- data/.github/issue_template.md +22 -0
- data/.github/workflows/ci.yml +32 -0
- data/.gitignore +9 -0
- data/.rubocop.yml +69 -0
- data/CHANGELOG.md +5 -0
- data/CODE_OF_CONDUCT.md +132 -0
- data/Dockerfile.ci +14 -0
- data/Gemfile +26 -0
- data/LICENSE.txt +21 -0
- data/README.md +104 -0
- data/RUNNING_UNIT_TESTS.md +38 -0
- data/Rakefile +45 -0
- data/VERSION +1 -0
- data/activerecord-sqlserver-adapter-odbc-extended.gemspec +34 -0
- data/compose.ci.yaml +15 -0
- data/lib/active_record/connection_adapters/extended_sqlserver_adapter.rb +204 -0
- data/lib/active_record/connection_adapters/sqlserver/core_ext/odbc.rb +41 -0
- data/lib/active_record/connection_adapters/sqlserver/odbc_database_statements.rb +234 -0
- data/lib/active_record/connection_adapters/sqlserver/type/binary_ext.rb +25 -0
- data/lib/activerecord-sqlserver-adapter-odbc-extended.rb +12 -0
- data/test/appveyor/dbsetup.ps1 +27 -0
- data/test/appveyor/dbsetup.sql +11 -0
- data/test/cases/active_schema_test_sqlserver.rb +127 -0
- data/test/cases/adapter_test_sqlserver.rb +648 -0
- data/test/cases/change_column_collation_test_sqlserver.rb +33 -0
- data/test/cases/change_column_null_test_sqlserver.rb +44 -0
- data/test/cases/coerced_tests.rb +2796 -0
- data/test/cases/column_test_sqlserver.rb +848 -0
- data/test/cases/connection_test_sqlserver.rb +138 -0
- data/test/cases/dbconsole.rb +19 -0
- data/test/cases/disconnected_test_sqlserver.rb +42 -0
- data/test/cases/eager_load_too_many_ids_test_sqlserver.rb +18 -0
- data/test/cases/enum_test_sqlserver.rb +49 -0
- data/test/cases/execute_procedure_test_sqlserver.rb +57 -0
- data/test/cases/fetch_test_sqlserver.rb +88 -0
- data/test/cases/fully_qualified_identifier_test_sqlserver.rb +72 -0
- data/test/cases/helper_sqlserver.rb +61 -0
- data/test/cases/migration_test_sqlserver.rb +144 -0
- data/test/cases/order_test_sqlserver.rb +153 -0
- data/test/cases/pessimistic_locking_test_sqlserver.rb +102 -0
- data/test/cases/primary_keys_test_sqlserver.rb +103 -0
- data/test/cases/rake_test_sqlserver.rb +198 -0
- data/test/cases/schema_dumper_test_sqlserver.rb +296 -0
- data/test/cases/schema_test_sqlserver.rb +111 -0
- data/test/cases/trigger_test_sqlserver.rb +51 -0
- data/test/cases/utils_test_sqlserver.rb +129 -0
- data/test/cases/uuid_test_sqlserver.rb +54 -0
- data/test/cases/view_test_sqlserver.rb +58 -0
- data/test/config.yml +38 -0
- data/test/debug.rb +16 -0
- data/test/fixtures/1px.gif +0 -0
- data/test/migrations/create_clients_and_change_column_collation.rb +19 -0
- data/test/migrations/create_clients_and_change_column_null.rb +25 -0
- data/test/migrations/transaction_table/1_table_will_never_be_created.rb +11 -0
- data/test/models/sqlserver/alien.rb +5 -0
- data/test/models/sqlserver/booking.rb +5 -0
- data/test/models/sqlserver/composite_pk.rb +9 -0
- data/test/models/sqlserver/customers_view.rb +5 -0
- data/test/models/sqlserver/datatype.rb +5 -0
- data/test/models/sqlserver/datatype_migration.rb +10 -0
- data/test/models/sqlserver/dollar_table_name.rb +5 -0
- data/test/models/sqlserver/edge_schema.rb +13 -0
- data/test/models/sqlserver/fk_has_fk.rb +5 -0
- data/test/models/sqlserver/fk_has_pk.rb +5 -0
- data/test/models/sqlserver/natural_pk_data.rb +6 -0
- data/test/models/sqlserver/natural_pk_int_data.rb +5 -0
- data/test/models/sqlserver/no_pk_data.rb +5 -0
- data/test/models/sqlserver/object_default.rb +5 -0
- data/test/models/sqlserver/quoted_table.rb +9 -0
- data/test/models/sqlserver/quoted_view_1.rb +5 -0
- data/test/models/sqlserver/quoted_view_2.rb +5 -0
- data/test/models/sqlserver/sst_memory.rb +5 -0
- data/test/models/sqlserver/sst_string_collation.rb +3 -0
- data/test/models/sqlserver/string_default.rb +5 -0
- data/test/models/sqlserver/string_defaults_big_view.rb +5 -0
- data/test/models/sqlserver/string_defaults_view.rb +5 -0
- data/test/models/sqlserver/table_with_spaces.rb +5 -0
- data/test/models/sqlserver/tinyint_pk.rb +5 -0
- data/test/models/sqlserver/trigger.rb +17 -0
- data/test/models/sqlserver/trigger_history.rb +5 -0
- data/test/models/sqlserver/upper.rb +5 -0
- data/test/models/sqlserver/uppered.rb +5 -0
- data/test/models/sqlserver/uuid.rb +5 -0
- data/test/schema/datatypes/2012.sql +56 -0
- data/test/schema/enable-in-memory-oltp.sql +81 -0
- data/test/schema/sqlserver_specific_schema.rb +363 -0
- data/test/support/coerceable_test_sqlserver.rb +55 -0
- data/test/support/connection_reflection.rb +32 -0
- data/test/support/core_ext/query_cache.rb +38 -0
- data/test/support/load_schema_sqlserver.rb +29 -0
- data/test/support/marshal_compatibility_fixtures/SQLServer/rails_6_1_topic.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/SQLServer/rails_6_1_topic_associations.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/SQLServer/rails_7_1_topic.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/SQLServer/rails_7_1_topic_associations.dump +0 -0
- data/test/support/minitest_sqlserver.rb +3 -0
- data/test/support/paths_sqlserver.rb +50 -0
- data/test/support/query_assertions.rb +49 -0
- data/test/support/rake_helpers.rb +46 -0
- data/test/support/table_definition_sqlserver.rb +24 -0
- data/test/support/test_in_memory_oltp.rb +17 -0
- 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,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,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,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,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;
|