activerecord-sqlserver-adapter 7.1.3 → 7.1.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +17 -0
- data/README.md +7 -2
- data/VERSION +1 -1
- data/lib/active_record/connection_adapters/sqlserver/core_ext/calculations.rb +1 -43
- data/lib/active_record/connection_adapters/sqlserver/database_statements.rb +15 -5
- data/lib/active_record/connection_adapters/sqlserver/schema_dumper.rb +11 -0
- data/lib/active_record/connection_adapters/sqlserver/schema_statements.rb +37 -12
- data/test/cases/adapter_test_sqlserver.rb +14 -2
- data/test/cases/schema_dumper_test_sqlserver.rb +23 -2
- data/test/cases/schema_test_sqlserver.rb +47 -1
- data/test/cases/trigger_test_sqlserver.rb +10 -0
- data/test/models/sqlserver/table_with_spaces.rb +5 -0
- data/test/models/sqlserver/trigger.rb +4 -0
- data/test/schema/sqlserver_specific_schema.rb +21 -0
- metadata +6 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: eea983d328f36bfb590c26ff592292369634d60b63ff38acc43e28c87e09c7ee
|
4
|
+
data.tar.gz: 7e9ab05308f76eb6be6ef5745977f4c0de684c608494d45d9d49d3ac54e1a4cb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 67f76bc1083712be03b8a8b3eb5a2c48b9d4efc44442b8573604aecaff23ccbd0bd1586529948497776aca6b7c18257ead5d62e239f2b69d92e2ec14e5675192
|
7
|
+
data.tar.gz: 845923a58bda81c5f32a81b40a61157b1d36c909352ac258bd848d2e604f95ee94e09878f3c8f475f3d770725c8492b8b58c4c87146c4965e0b29d91b64872fc
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,20 @@
|
|
1
|
+
## v7.1.5
|
2
|
+
|
3
|
+
#### Added
|
4
|
+
|
5
|
+
- [#1201](https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/pull/1201) Support non-dbo schemas in schema dumper
|
6
|
+
- [#1206](https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/pull/1206) Support table names containing spaces
|
7
|
+
|
8
|
+
## v7.1.4
|
9
|
+
|
10
|
+
#### Fixed
|
11
|
+
|
12
|
+
- [#1164](https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/pull/1164) Fix composite primary key with different data type with triggers
|
13
|
+
|
14
|
+
#### Changed
|
15
|
+
|
16
|
+
- [#1199](https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/pull/1199) Remove ActiveRecord::Relation#calculate patch
|
17
|
+
|
1
18
|
## v7.1.3
|
2
19
|
|
3
20
|
#### Fixed
|
data/README.md
CHANGED
@@ -13,8 +13,9 @@ Interested in older versions? We follow a rational versioning policy that tracks
|
|
13
13
|
|
14
14
|
| Adapter Version | Rails Version | Support | Branch |
|
15
15
|
|-----------------|---------------|---------|--------------------------------------------------------------------------------------------------|
|
16
|
-
|
|
17
|
-
| `7.
|
16
|
+
| Unreleased | `7.2.x` | In Development | [main](https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/tree/main) |
|
17
|
+
| `7.1.5` | `7.1.x` | Active | [7-1-stable](https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/tree/7-1-stable) |
|
18
|
+
| `7.0.7` | `7.0.x` | Active | [7-0-stable](https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/tree/7-0-stable) |
|
18
19
|
| `6.1.3.0` | `6.1.x` | Active | [6-1-stable](https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/tree/6-1-stable) |
|
19
20
|
| `6.0.3` | `6.0.x` | Ended | [6-0-stable](https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/tree/6-0-stable) |
|
20
21
|
| `5.2.1` | `5.2.x` | Ended | [5-2-stable](https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/tree/5-2-stable) |
|
@@ -49,6 +50,10 @@ adapter.exclude_output_inserted_table_names['my_table_name'] = true
|
|
49
50
|
|
50
51
|
# Explicitly set the data type for the temporary key table.
|
51
52
|
adapter.exclude_output_inserted_table_names['my_uuid_table_name'] = 'uniqueidentifier'
|
53
|
+
|
54
|
+
|
55
|
+
# Explicitly set data types when data type is different for composite primary keys.
|
56
|
+
adapter.exclude_output_inserted_table_names['my_composite_pk_table_name'] = { pk_col_one: "uniqueidentifier", pk_col_two: "int" }
|
52
57
|
```
|
53
58
|
|
54
59
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
7.1.
|
1
|
+
7.1.5
|
@@ -8,51 +8,9 @@ module ActiveRecord
|
|
8
8
|
module SQLServer
|
9
9
|
module CoreExt
|
10
10
|
module Calculations
|
11
|
-
|
12
|
-
if klass.connection.sqlserver?
|
13
|
-
_calculate(operation, column_name)
|
14
|
-
else
|
15
|
-
super
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
11
|
+
|
19
12
|
private
|
20
13
|
|
21
|
-
# Same as original `calculate` method except we don't perform PostgreSQL hack that removes ordering.
|
22
|
-
def _calculate(operation, column_name)
|
23
|
-
operation = operation.to_s.downcase
|
24
|
-
|
25
|
-
if @none
|
26
|
-
case operation
|
27
|
-
when "count", "sum"
|
28
|
-
result = group_values.any? ? Hash.new : 0
|
29
|
-
return @async ? Promise::Complete.new(result) : result
|
30
|
-
when "average", "minimum", "maximum"
|
31
|
-
result = group_values.any? ? Hash.new : nil
|
32
|
-
return @async ? Promise::Complete.new(result) : result
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
if has_include?(column_name)
|
37
|
-
relation = apply_join_dependency
|
38
|
-
|
39
|
-
if operation == "count"
|
40
|
-
unless distinct_value || distinct_select?(column_name || select_for_count)
|
41
|
-
relation.distinct!
|
42
|
-
relation.select_values = [ klass.primary_key || table[Arel.star] ]
|
43
|
-
end
|
44
|
-
# PostgreSQL: ORDER BY expressions must appear in SELECT list when using DISTINCT
|
45
|
-
# Start of monkey-patch
|
46
|
-
# relation.order_values = [] if group_values.empty?
|
47
|
-
# End of monkey-patch
|
48
|
-
end
|
49
|
-
|
50
|
-
relation.calculate(operation, column_name)
|
51
|
-
else
|
52
|
-
perform_calculation(operation, column_name)
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
14
|
def build_count_subquery(relation, column_name, distinct)
|
57
15
|
return super unless klass.connection.adapter_name == "SQLServer"
|
58
16
|
|
@@ -278,13 +278,17 @@ module ActiveRecord
|
|
278
278
|
exclude_output_inserted = exclude_output_inserted_table_name?(table_name, sql)
|
279
279
|
|
280
280
|
if exclude_output_inserted
|
281
|
-
|
281
|
+
pk_and_types = Array(pk).map do |subkey|
|
282
|
+
{
|
283
|
+
quoted: SQLServer::Utils.extract_identifiers(subkey).quoted,
|
284
|
+
id_sql_type: exclude_output_inserted_id_sql_type(subkey, exclude_output_inserted)
|
285
|
+
}
|
286
|
+
end
|
282
287
|
|
283
|
-
id_sql_type = exclude_output_inserted.is_a?(TrueClass) ? "bigint" : exclude_output_inserted
|
284
288
|
<<~SQL.squish
|
285
|
-
DECLARE @ssaIdInsertTable table (#{
|
286
|
-
#{sql.dup.insert sql.index(/ (DEFAULT )?VALUES/i), " OUTPUT #{
|
287
|
-
SELECT #{
|
289
|
+
DECLARE @ssaIdInsertTable table (#{pk_and_types.map { |pk_and_type| "#{pk_and_type[:quoted]} #{pk_and_type[:id_sql_type]}"}.join(", ") });
|
290
|
+
#{sql.dup.insert sql.index(/ (DEFAULT )?VALUES/i), " OUTPUT #{ pk_and_types.map { |pk_and_type| "INSERTED.#{pk_and_type[:quoted]}" }.join(", ") } INTO @ssaIdInsertTable"}
|
291
|
+
SELECT #{pk_and_types.map {|pk_and_type| "CAST(#{pk_and_type[:quoted]} AS #{pk_and_type[:id_sql_type]}) #{pk_and_type[:quoted]}"}.join(", ")} FROM @ssaIdInsertTable
|
288
292
|
SQL
|
289
293
|
else
|
290
294
|
returning_columns = returning || Array(pk)
|
@@ -382,6 +386,12 @@ module ActiveRecord
|
|
382
386
|
self.class.exclude_output_inserted_table_names[table_name]
|
383
387
|
end
|
384
388
|
|
389
|
+
def exclude_output_inserted_id_sql_type(pk, exclude_output_inserted)
|
390
|
+
return "bigint" if exclude_output_inserted.is_a?(TrueClass)
|
391
|
+
return exclude_output_inserted[pk.to_sym] if exclude_output_inserted.is_a?(Hash)
|
392
|
+
exclude_output_inserted
|
393
|
+
end
|
394
|
+
|
385
395
|
def query_requires_identity_insert?(sql)
|
386
396
|
return false unless insert_sql?(sql)
|
387
397
|
|
@@ -39,6 +39,17 @@ module ActiveRecord
|
|
39
39
|
def default_primary_key?(column)
|
40
40
|
super && column.is_identity?
|
41
41
|
end
|
42
|
+
|
43
|
+
def schemas(stream)
|
44
|
+
schema_names = @connection.schema_names
|
45
|
+
|
46
|
+
if schema_names.any?
|
47
|
+
schema_names.sort.each do |name|
|
48
|
+
stream.puts " create_schema #{name.inspect}"
|
49
|
+
end
|
50
|
+
stream.puts
|
51
|
+
end
|
52
|
+
end
|
42
53
|
end
|
43
54
|
end
|
44
55
|
end
|
@@ -393,19 +393,37 @@ module ActiveRecord
|
|
393
393
|
execute "DROP SCHEMA [#{schema_name}]"
|
394
394
|
end
|
395
395
|
|
396
|
+
# Returns an array of schema names.
|
397
|
+
def schema_names
|
398
|
+
sql = <<~SQL.squish
|
399
|
+
SELECT name
|
400
|
+
FROM sys.schemas
|
401
|
+
WHERE
|
402
|
+
name NOT LIKE 'db_%' AND
|
403
|
+
name NOT IN ('INFORMATION_SCHEMA', 'sys')
|
404
|
+
SQL
|
405
|
+
|
406
|
+
query_values(sql, "SCHEMA")
|
407
|
+
end
|
408
|
+
|
396
409
|
private
|
397
410
|
|
398
411
|
def data_source_sql(name = nil, type: nil)
|
399
|
-
scope = quoted_scope
|
412
|
+
scope = quoted_scope(name, type: type)
|
400
413
|
|
401
|
-
|
402
|
-
|
414
|
+
table_schema = lowercase_schema_reflection_sql('TABLE_SCHEMA')
|
415
|
+
table_name = lowercase_schema_reflection_sql('TABLE_NAME')
|
416
|
+
database = scope[:database].present? ? "#{scope[:database]}." : ""
|
403
417
|
table_catalog = scope[:database].present? ? quote(scope[:database]) : "DB_NAME()"
|
404
418
|
|
405
|
-
sql = "SELECT
|
419
|
+
sql = "SELECT "
|
420
|
+
sql += " CASE"
|
421
|
+
sql += " WHEN #{table_schema} = 'dbo' THEN #{table_name}"
|
422
|
+
sql += " ELSE CONCAT(#{table_schema}, '.', #{table_name})"
|
423
|
+
sql += " END"
|
406
424
|
sql += " FROM #{database}INFORMATION_SCHEMA.TABLES WITH (NOLOCK)"
|
407
425
|
sql += " WHERE TABLE_CATALOG = #{table_catalog}"
|
408
|
-
sql += " AND TABLE_SCHEMA = #{quote(scope[:schema])}"
|
426
|
+
sql += " AND TABLE_SCHEMA = #{quote(scope[:schema])}" if scope[:schema]
|
409
427
|
sql += " AND TABLE_NAME = #{quote(scope[:name])}" if scope[:name]
|
410
428
|
sql += " AND TABLE_TYPE = #{quote(scope[:type])}" if scope[:type]
|
411
429
|
sql += " ORDER BY #{table_name}"
|
@@ -414,9 +432,10 @@ module ActiveRecord
|
|
414
432
|
|
415
433
|
def quoted_scope(name = nil, type: nil)
|
416
434
|
identifier = SQLServer::Utils.extract_identifiers(name)
|
435
|
+
|
417
436
|
{}.tap do |scope|
|
418
437
|
scope[:database] = identifier.database if identifier.database
|
419
|
-
scope[:schema] = identifier.schema || "dbo"
|
438
|
+
scope[:schema] = identifier.schema || "dbo" if name.present?
|
420
439
|
scope[:name] = identifier.object if identifier.object
|
421
440
|
scope[:type] = type if type
|
422
441
|
end
|
@@ -654,12 +673,18 @@ module ActiveRecord
|
|
654
673
|
|
655
674
|
# Parses the raw table name that is used in the SQL. Table name could include database/schema/etc.
|
656
675
|
def get_raw_table_name(sql)
|
657
|
-
|
658
|
-
|
659
|
-
|
660
|
-
|
661
|
-
|
662
|
-
|
676
|
+
s = sql.gsub(/^\s*EXEC sp_executesql N'/i, "")
|
677
|
+
|
678
|
+
if s.match?(/^\s*INSERT INTO.*/i)
|
679
|
+
s.split(/INSERT INTO/i)[1]
|
680
|
+
.split(/OUTPUT INSERTED/i)[0]
|
681
|
+
.split(/(DEFAULT)?\s+VALUES/i)[0]
|
682
|
+
.match(/\s*([^(]*)/i)[0]
|
683
|
+
elsif s.match?(/^\s*UPDATE\s+.*/i)
|
684
|
+
s.match(/UPDATE\s+([^\(\s]+)\s*/i)[1]
|
685
|
+
else
|
686
|
+
s.match(/FROM\s+((\[[^\(\]]+\])|[^\(\s]+)\s*/i)[1]
|
687
|
+
end.strip
|
663
688
|
end
|
664
689
|
|
665
690
|
def default_constraint_name(table_name, column_name)
|
@@ -550,11 +550,23 @@ class AdapterTestSQLServer < ActiveRecord::TestCase
|
|
550
550
|
|
551
551
|
describe 'table is in non-dbo schema' do
|
552
552
|
it "records can be created successfully" do
|
553
|
-
Alien.
|
553
|
+
assert_difference("Alien.count", 1) do
|
554
|
+
Alien.create!(name: 'Trisolarans')
|
555
|
+
end
|
554
556
|
end
|
555
557
|
|
556
558
|
it 'records can be inserted using SQL' do
|
557
|
-
Alien.
|
559
|
+
assert_difference("Alien.count", 2) do
|
560
|
+
Alien.connection.exec_insert("insert into [test].[aliens] (id, name) VALUES(1, 'Trisolarans'), (2, 'Xenomorph')")
|
561
|
+
end
|
562
|
+
end
|
563
|
+
end
|
564
|
+
|
565
|
+
describe 'table names contains spaces' do
|
566
|
+
it 'records can be created successfully' do
|
567
|
+
assert_difference("TableWithSpaces.count", 1) do
|
568
|
+
TableWithSpaces.create!(name: 'Bob')
|
569
|
+
end
|
558
570
|
end
|
559
571
|
end
|
560
572
|
|
@@ -1,6 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require "cases/helper_sqlserver"
|
4
|
+
require "stringio"
|
4
5
|
|
5
6
|
class SchemaDumperTestSQLServer < ActiveRecord::TestCase
|
6
7
|
before { all_tables }
|
@@ -141,7 +142,7 @@ class SchemaDumperTestSQLServer < ActiveRecord::TestCase
|
|
141
142
|
it "honor nonstandard primary keys" do
|
142
143
|
generate_schema_for_table("movies") do |output|
|
143
144
|
match = output.match(%r{create_table "movies"(.*)do})
|
144
|
-
assert_not_nil(match, "
|
145
|
+
assert_not_nil(match, "non-standard primary key table not found")
|
145
146
|
assert_match %r(primary_key: "movieid"), match[1], "non-standard primary key not preserved"
|
146
147
|
end
|
147
148
|
end
|
@@ -159,14 +160,32 @@ class SchemaDumperTestSQLServer < ActiveRecord::TestCase
|
|
159
160
|
_(output.scan('t.integer "unique_field"').length).must_equal(1)
|
160
161
|
end
|
161
162
|
|
163
|
+
it "schemas are dumped and tables names only include non-default schema" do
|
164
|
+
stream = StringIO.new
|
165
|
+
ActiveRecord::SchemaDumper.dump(ActiveRecord::Base.connection, stream)
|
166
|
+
generated_schema = stream.string
|
167
|
+
|
168
|
+
# Only generate non-default schemas. Default schema is 'dbo'.
|
169
|
+
assert_not_includes generated_schema, 'create_schema "dbo"'
|
170
|
+
assert_includes generated_schema, 'create_schema "test"'
|
171
|
+
assert_includes generated_schema, 'create_schema "test2"'
|
172
|
+
|
173
|
+
# Only non-default schemas should be included in table names. Default schema is 'dbo'.
|
174
|
+
assert_includes generated_schema, 'create_table "accounts"'
|
175
|
+
assert_includes generated_schema, 'create_table "test.aliens"'
|
176
|
+
assert_includes generated_schema, 'create_table "test2.sst_schema_test_mulitple_schema"'
|
177
|
+
end
|
178
|
+
|
162
179
|
private
|
163
180
|
|
164
181
|
def generate_schema_for_table(*table_names)
|
165
|
-
|
182
|
+
previous_ignore_tables = ActiveRecord::SchemaDumper.ignore_tables
|
183
|
+
ActiveRecord::SchemaDumper.ignore_tables = all_tables - table_names
|
166
184
|
|
167
185
|
stream = StringIO.new
|
168
186
|
ActiveRecord::SchemaDumper.ignore_tables = all_tables - table_names
|
169
187
|
ActiveRecord::SchemaDumper.dump(ActiveRecord::Base.connection, stream)
|
188
|
+
|
170
189
|
@generated_schema = stream.string
|
171
190
|
yield @generated_schema if block_given?
|
172
191
|
@schema_lines = Hash.new
|
@@ -177,6 +196,8 @@ class SchemaDumperTestSQLServer < ActiveRecord::TestCase
|
|
177
196
|
@schema_lines[Regexp.last_match[1]] = SchemaLine.new(line)
|
178
197
|
end
|
179
198
|
@generated_schema
|
199
|
+
ensure
|
200
|
+
ActiveRecord::SchemaDumper.ignore_tables = previous_ignore_tables
|
180
201
|
end
|
181
202
|
|
182
203
|
def line(column_name)
|
@@ -39,7 +39,7 @@ class SchemaTestSQLServer < ActiveRecord::TestCase
|
|
39
39
|
assert_equal 1, columns.select { |c| c.is_identity? }.size
|
40
40
|
end
|
41
41
|
|
42
|
-
it "return correct varchar and nvarchar column limit length when table is in non
|
42
|
+
it "return correct varchar and nvarchar column limit length when table is in non-dbo schema" do
|
43
43
|
columns = connection.columns("test.sst_schema_columns")
|
44
44
|
|
45
45
|
assert_equal 255, columns.find { |c| c.name == "name" }.limit
|
@@ -48,4 +48,50 @@ class SchemaTestSQLServer < ActiveRecord::TestCase
|
|
48
48
|
assert_equal 1000, columns.find { |c| c.name == "n_description" }.limit
|
49
49
|
end
|
50
50
|
end
|
51
|
+
|
52
|
+
describe "parsing table name from raw SQL" do
|
53
|
+
describe 'SELECT statements' do
|
54
|
+
it do
|
55
|
+
assert_equal "[sst_schema_columns]", connection.send(:get_raw_table_name, "SELECT [sst_schema_columns].[id] FROM [sst_schema_columns]")
|
56
|
+
end
|
57
|
+
|
58
|
+
it do
|
59
|
+
assert_equal "sst_schema_columns", connection.send(:get_raw_table_name, "SELECT [sst_schema_columns].[id] FROM sst_schema_columns")
|
60
|
+
end
|
61
|
+
|
62
|
+
it do
|
63
|
+
assert_equal "[WITH - SPACES]", connection.send(:get_raw_table_name, "SELECT id FROM [WITH - SPACES]")
|
64
|
+
end
|
65
|
+
|
66
|
+
it do
|
67
|
+
assert_equal "[WITH - SPACES$DOLLAR]", connection.send(:get_raw_table_name, "SELECT id FROM [WITH - SPACES$DOLLAR]")
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
describe 'INSERT statements' do
|
72
|
+
it do
|
73
|
+
assert_equal "[dashboards]", connection.send(:get_raw_table_name, "INSERT INTO [dashboards] DEFAULT VALUES; SELECT CAST(SCOPE_IDENTITY() AS bigint) AS Ident")
|
74
|
+
end
|
75
|
+
|
76
|
+
it do
|
77
|
+
assert_equal "lock_without_defaults", connection.send(:get_raw_table_name, "INSERT INTO lock_without_defaults(title) VALUES('title1')")
|
78
|
+
end
|
79
|
+
|
80
|
+
it do
|
81
|
+
assert_equal "json_data_type", connection.send(:get_raw_table_name, "insert into json_data_type (payload) VALUES ('null')")
|
82
|
+
end
|
83
|
+
|
84
|
+
it do
|
85
|
+
assert_equal "[auto_increments]", connection.send(:get_raw_table_name, "INSERT INTO [auto_increments] OUTPUT INSERTED.[id] DEFAULT VALUES")
|
86
|
+
end
|
87
|
+
|
88
|
+
it do
|
89
|
+
assert_equal "[WITH - SPACES]", connection.send(:get_raw_table_name, "EXEC sp_executesql N'INSERT INTO [WITH - SPACES] ([external_id]) OUTPUT INSERTED.[id] VALUES (@0)', N'@0 bigint', @0 = 10")
|
90
|
+
end
|
91
|
+
|
92
|
+
it do
|
93
|
+
assert_equal "[test].[aliens]", connection.send(:get_raw_table_name, "EXEC sp_executesql N'INSERT INTO [test].[aliens] ([name]) OUTPUT INSERTED.[id] VALUES (@0)', N'@0 varchar(255)', @0 = 'Trisolarans'")
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
51
97
|
end
|
@@ -38,4 +38,14 @@ class SQLServerTriggerTest < ActiveRecord::TestCase
|
|
38
38
|
_(obj.pk_col_two).must_equal 42
|
39
39
|
_(obj.pk_col_one.to_s).must_equal SSTestTriggerHistory.first.id_source
|
40
40
|
end
|
41
|
+
|
42
|
+
it "can insert into a table with composite pk with different data type with output inserted - with a hash setting for table name" do
|
43
|
+
exclude_output_inserted_table_names["sst_table_with_composite_pk_trigger_with_different_data_type"] = { pk_col_one: "uniqueidentifier", pk_col_two: "int" }
|
44
|
+
assert SSTestTriggerHistory.all.empty?
|
45
|
+
obj = SSTestTriggerCompositePkWithDefferentDataType.create! pk_col_two: 123, event_name: "test trigger"
|
46
|
+
_(obj.event_name).must_equal "test trigger"
|
47
|
+
_(obj.pk_col_one).must_be :present?
|
48
|
+
_(obj.pk_col_two).must_equal 123
|
49
|
+
_(obj.pk_col_one.to_s).must_equal SSTestTriggerHistory.first.id_source
|
50
|
+
end
|
41
51
|
end
|
@@ -11,3 +11,7 @@ end
|
|
11
11
|
class SSTestTriggerCompositePk < ActiveRecord::Base
|
12
12
|
self.table_name = "sst_table_with_composite_pk_trigger"
|
13
13
|
end
|
14
|
+
|
15
|
+
class SSTestTriggerCompositePkWithDefferentDataType < ActiveRecord::Base
|
16
|
+
self.table_name = "sst_table_with_composite_pk_trigger_with_different_data_type"
|
17
|
+
end
|
@@ -151,6 +151,10 @@ ActiveRecord::Schema.define do
|
|
151
151
|
SELECT GETUTCDATE() utcdate
|
152
152
|
SQL
|
153
153
|
|
154
|
+
create_table 'A Table With Spaces', force: true do |t|
|
155
|
+
t.string :name
|
156
|
+
end
|
157
|
+
|
154
158
|
# Constraints
|
155
159
|
|
156
160
|
create_table(:sst_has_fks, force: true) do |t|
|
@@ -249,6 +253,23 @@ ActiveRecord::Schema.define do
|
|
249
253
|
SELECT pk_col_one AS id_source, event_name FROM INSERTED
|
250
254
|
SQL
|
251
255
|
|
256
|
+
execute "IF EXISTS(SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'sst_table_with_composite_pk_trigger_with_different_data_type') DROP TABLE sst_table_with_composite_pk_trigger_with_different_data_type"
|
257
|
+
execute <<-SQL
|
258
|
+
CREATE TABLE sst_table_with_composite_pk_trigger_with_different_data_type(
|
259
|
+
pk_col_one uniqueidentifier DEFAULT NEWID(),
|
260
|
+
pk_col_two int NOT NULL,
|
261
|
+
event_name nvarchar(255),
|
262
|
+
CONSTRAINT PK_sst_table_with_composite_pk_trigger_with_different_data_type PRIMARY KEY (pk_col_one, pk_col_two)
|
263
|
+
)
|
264
|
+
SQL
|
265
|
+
execute <<-SQL
|
266
|
+
CREATE TRIGGER sst_table_with_composite_pk_trigger_with_different_data_type_t ON sst_table_with_composite_pk_trigger_with_different_data_type
|
267
|
+
FOR INSERT
|
268
|
+
AS
|
269
|
+
INSERT INTO sst_table_with_trigger_history (id_source, event_name)
|
270
|
+
SELECT pk_col_one AS id_source, event_name FROM INSERTED
|
271
|
+
SQL
|
272
|
+
|
252
273
|
# Another schema.
|
253
274
|
|
254
275
|
create_table :sst_schema_columns, force: true do |t|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: activerecord-sqlserver-adapter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 7.1.
|
4
|
+
version: 7.1.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ken Collins
|
@@ -15,7 +15,7 @@ authors:
|
|
15
15
|
autorequire:
|
16
16
|
bindir: bin
|
17
17
|
cert_chain: []
|
18
|
-
date: 2024-
|
18
|
+
date: 2024-07-25 00:00:00.000000000 Z
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
21
|
name: activerecord
|
@@ -212,6 +212,7 @@ files:
|
|
212
212
|
- test/models/sqlserver/string_default.rb
|
213
213
|
- test/models/sqlserver/string_defaults_big_view.rb
|
214
214
|
- test/models/sqlserver/string_defaults_view.rb
|
215
|
+
- test/models/sqlserver/table_with_spaces.rb
|
215
216
|
- test/models/sqlserver/tinyint_pk.rb
|
216
217
|
- test/models/sqlserver/trigger.rb
|
217
218
|
- test/models/sqlserver/trigger_history.rb
|
@@ -239,8 +240,8 @@ licenses:
|
|
239
240
|
- MIT
|
240
241
|
metadata:
|
241
242
|
bug_tracker_uri: https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/issues
|
242
|
-
changelog_uri: https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/blob/v7.1.
|
243
|
-
source_code_uri: https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/tree/v7.1.
|
243
|
+
changelog_uri: https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/blob/v7.1.5/CHANGELOG.md
|
244
|
+
source_code_uri: https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/tree/v7.1.5
|
244
245
|
post_install_message:
|
245
246
|
rdoc_options: []
|
246
247
|
require_paths:
|
@@ -329,6 +330,7 @@ test_files:
|
|
329
330
|
- test/models/sqlserver/string_default.rb
|
330
331
|
- test/models/sqlserver/string_defaults_big_view.rb
|
331
332
|
- test/models/sqlserver/string_defaults_view.rb
|
333
|
+
- test/models/sqlserver/table_with_spaces.rb
|
332
334
|
- test/models/sqlserver/tinyint_pk.rb
|
333
335
|
- test/models/sqlserver/trigger.rb
|
334
336
|
- test/models/sqlserver/trigger_history.rb
|