Skip to content

Commit 876413d

Browse files
authored
[sqlserver] collect foreign key delete and update action (#19796)
* collect fk delete and update action * add changelog * remove debug print * remove unneeded groupby * remove object_id from groupby * remove definition
1 parent 1c638d8 commit 876413d

File tree

9 files changed

+61
-18
lines changed

9 files changed

+61
-18
lines changed

sqlserver/changelog.d/19796.added

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Collect SQL Server foreign key delete & update actions.

sqlserver/datadog_checks/sqlserver/queries.py

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -90,24 +90,30 @@
9090

9191
FOREIGN_KEY_QUERY = """
9292
SELECT
93-
FK.parent_object_id AS id,
93+
FK.parent_object_id AS table_id,
9494
FK.name AS foreign_key_name,
9595
OBJECT_NAME(FK.parent_object_id) AS referencing_table,
9696
STRING_AGG(COL_NAME(FKC.parent_object_id, FKC.parent_column_id),',') AS referencing_column,
9797
OBJECT_NAME(FK.referenced_object_id) AS referenced_table,
98-
STRING_AGG(COL_NAME(FKC.referenced_object_id, FKC.referenced_column_id),',') AS referenced_column
98+
STRING_AGG(COL_NAME(FKC.referenced_object_id, FKC.referenced_column_id),',') AS referenced_column,
99+
FK.delete_referential_action_desc AS delete_action,
100+
FK.update_referential_action_desc AS update_action
99101
FROM
100102
sys.foreign_keys AS FK
101103
JOIN sys.foreign_key_columns AS FKC ON FK.object_id = FKC.constraint_object_id
102104
WHERE
103105
FK.parent_object_id IN ({})
104106
GROUP BY
105-
FK.name, FK.parent_object_id, FK.referenced_object_id;
107+
FK.name,
108+
FK.parent_object_id,
109+
FK.referenced_object_id,
110+
FK.delete_referential_action_desc,
111+
FK.update_referential_action_desc;
106112
"""
107113

108114
FOREIGN_KEY_QUERY_PRE_2017 = """
109115
SELECT
110-
FK.parent_object_id AS id,
116+
FK.parent_object_id AS table_id,
111117
FK.name AS foreign_key_name,
112118
OBJECT_NAME(FK.parent_object_id) AS referencing_table,
113119
STUFF((
@@ -120,16 +126,19 @@
120126
SELECT ',' + COL_NAME(FKC.referenced_object_id, FKC.referenced_column_id)
121127
FROM sys.foreign_key_columns AS FKC
122128
WHERE FKC.constraint_object_id = FK.object_id
123-
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '') AS referenced_column
129+
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '') AS referenced_column,
130+
FK.delete_referential_action_desc AS delete_action,
131+
FK.update_referential_action_desc AS update_action
124132
FROM
125133
sys.foreign_keys AS FK
126134
WHERE
127135
FK.parent_object_id IN ({})
128136
GROUP BY
129137
FK.name,
130138
FK.parent_object_id,
131-
FK.object_id,
132-
FK.referenced_object_id;
139+
FK.referenced_object_id,
140+
FK.delete_referential_action_desc,
141+
FK.update_referential_action_desc;
133142
"""
134143

135144
DEFAULT_DM_XE_TARGETS = "sys.dm_xe_session_targets"

sqlserver/datadog_checks/sqlserver/schemas.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -279,6 +279,8 @@ def _collect_schemas_data(self):
279279
"referencing_column": str
280280
"referenced_table": str
281281
"referenced_column": str
282+
"delete_action": str
283+
"update_action": str
282284
partitions: partition dict
283285
partition
284286
key/value:
@@ -365,6 +367,8 @@ def _get_tables_data(self, table_list, schema, cursor):
365367
"referencing_column": str
366368
"referenced_table": str
367369
"referenced_column": str
370+
"delete_action": str
371+
"update_action": str
368372
partitions: partition dict
369373
partition
370374
key/value:
@@ -443,7 +447,7 @@ def _populate_with_foreign_keys_data(self, table_ids, table_id_to_table_data, cu
443447
foreign_key_query = FOREIGN_KEY_QUERY_PRE_2017
444448
rows = execute_query(foreign_key_query.format(table_ids), cursor)
445449
for row in rows:
446-
table_id = row.pop("id", None)
450+
table_id = row.pop("table_id", None)
447451
table_id_str = str(table_id)
448452
table_id_to_table_data.get(table_id_str).setdefault("foreign_keys", [])
449453
table_id_to_table_data.get(table_id_str)["foreign_keys"].append(row)

sqlserver/tests/compose-ha/sql/aoag_primary.sql

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,9 @@ GO
7777
-- Create table with a foreign key
7878
CREATE TABLE datadog_test_schemas.test_schema.landmarks (name varchar(255), city_id int DEFAULT 0);
7979
GO
80-
ALTER TABLE datadog_test_schemas.test_schema.landmarks ADD CONSTRAINT FK_CityId FOREIGN KEY (city_id) REFERENCES datadog_test_schemas.test_schema.cities(id);
80+
ALTER TABLE datadog_test_schemas.test_schema.landmarks ADD CONSTRAINT FK_CityId FOREIGN KEY (city_id)
81+
REFERENCES datadog_test_schemas.test_schema.cities(id)
82+
ON DELETE SET NULL;
8183
GO
8284

8385
-- Create table with unique constraint
@@ -94,7 +96,10 @@ CREATE TABLE datadog_test_schemas.test_schema.RestaurantReviews (
9496
RestaurantName VARCHAR(255),
9597
District VARCHAR(100),
9698
Review VARCHAR(MAX),
97-
CONSTRAINT FK_RestaurantNameDistrict FOREIGN KEY (RestaurantName, District) REFERENCES datadog_test_schemas.test_schema.Restaurants(RestaurantName, District)
99+
CONSTRAINT FK_RestaurantNameDistrict FOREIGN KEY (RestaurantName, District)
100+
REFERENCES datadog_test_schemas.test_schema.Restaurants(RestaurantName, District)
101+
ON DELETE CASCADE
102+
ON UPDATE SET NULL
98103
);
99104
GO
100105

sqlserver/tests/compose-high-cardinality-windows/setup.sql

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,9 @@ GO
6565
-- Create table with a foreign key
6666
CREATE TABLE datadog_test_schemas.test_schema.landmarks (name varchar(255), city_id int DEFAULT 0);
6767
GO
68-
ALTER TABLE datadog_test_schemas.test_schema.landmarks ADD CONSTRAINT FK_CityId FOREIGN KEY (city_id) REFERENCES datadog_test_schemas.test_schema.cities(id);
68+
ALTER TABLE datadog_test_schemas.test_schema.landmarks ADD CONSTRAINT FK_CityId FOREIGN KEY (city_id)
69+
REFERENCES datadog_test_schemas.test_schema.cities(id)
70+
ON DELETE SET NULL;
6971
GO
7072

7173
-- Create table with unique constraint
@@ -82,7 +84,10 @@ CREATE TABLE datadog_test_schemas.test_schema.RestaurantReviews (
8284
RestaurantName VARCHAR(255),
8385
District VARCHAR(100),
8486
Review VARCHAR(MAX),
85-
CONSTRAINT FK_RestaurantNameDistrict FOREIGN KEY (RestaurantName, District) REFERENCES datadog_test_schemas.test_schema.Restaurants(RestaurantName, District)
87+
CONSTRAINT FK_RestaurantNameDistrict FOREIGN KEY (RestaurantName, District)
88+
REFERENCES datadog_test_schemas.test_schema.Restaurants(RestaurantName, District)
89+
ON DELETE CASCADE
90+
ON UPDATE SET NULL
8691
);
8792
GO
8893

sqlserver/tests/compose-high-cardinality/setup.sql

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,9 @@ GO
158158
-- Create table with a foreign key
159159
CREATE TABLE datadog_test_schemas.test_schema.landmarks (name varchar(255), city_id int DEFAULT 0);
160160
GO
161-
ALTER TABLE datadog_test_schemas.test_schema.landmarks ADD CONSTRAINT FK_CityId FOREIGN KEY (city_id) REFERENCES datadog_test_schemas.test_schema.cities(id);
161+
ALTER TABLE datadog_test_schemas.test_schema.landmarks ADD CONSTRAINT FK_CityId
162+
FOREIGN KEY (city_id) REFERENCES datadog_test_schemas.test_schema.cities(id)
163+
ON DELETE SET NULL;
162164
GO
163165

164166
-- Create table with unique constraint
@@ -175,7 +177,10 @@ CREATE TABLE datadog_test_schemas.test_schema.RestaurantReviews (
175177
RestaurantName VARCHAR(255),
176178
District VARCHAR(100),
177179
Review VARCHAR(MAX),
178-
CONSTRAINT FK_RestaurantNameDistrict FOREIGN KEY (RestaurantName, District) REFERENCES datadog_test_schemas.test_schema.Restaurants(RestaurantName, District)
180+
CONSTRAINT FK_RestaurantNameDistrict FOREIGN KEY (RestaurantName, District)
181+
REFERENCES datadog_test_schemas.test_schema.Restaurants(RestaurantName, District)
182+
ON DELETE CASCADE
183+
ON UPDATE SET NULL
179184
);
180185
GO
181186

sqlserver/tests/compose-windows/setup.sql

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,9 @@ GO
6767
-- Create table with a foreign key
6868
CREATE TABLE datadog_test_schemas.test_schema.landmarks (name varchar(255), city_id int DEFAULT 0);
6969
GO
70-
ALTER TABLE datadog_test_schemas.test_schema.landmarks ADD CONSTRAINT FK_CityId FOREIGN KEY (city_id) REFERENCES datadog_test_schemas.test_schema.cities(id);
70+
ALTER TABLE datadog_test_schemas.test_schema.landmarks ADD CONSTRAINT FK_CityId FOREIGN KEY (city_id)
71+
REFERENCES datadog_test_schemas.test_schema.cities(id)
72+
ON DELETE SET NULL;
7173
GO
7274

7375
-- Create table with unique constraint
@@ -84,7 +86,10 @@ CREATE TABLE datadog_test_schemas.test_schema.RestaurantReviews (
8486
RestaurantName VARCHAR(255),
8587
District VARCHAR(100),
8688
Review VARCHAR(MAX),
87-
CONSTRAINT FK_RestaurantNameDistrict FOREIGN KEY (RestaurantName, District) REFERENCES datadog_test_schemas.test_schema.Restaurants(RestaurantName, District)
89+
CONSTRAINT FK_RestaurantNameDistrict FOREIGN KEY (RestaurantName, District)
90+
REFERENCES datadog_test_schemas.test_schema.Restaurants(RestaurantName, District)
91+
ON DELETE CASCADE
92+
ON UPDATE SET NULL
8893
);
8994
GO
9095

sqlserver/tests/compose/setup.sql

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,9 @@ GO
5656
-- Create table with a foreign key
5757
CREATE TABLE datadog_test_schemas.test_schema.landmarks (name varchar(255), city_id int DEFAULT 0);
5858
GO
59-
ALTER TABLE datadog_test_schemas.test_schema.landmarks ADD CONSTRAINT FK_CityId FOREIGN KEY (city_id) REFERENCES datadog_test_schemas.test_schema.cities(id);
59+
ALTER TABLE datadog_test_schemas.test_schema.landmarks ADD CONSTRAINT FK_CityId FOREIGN KEY (city_id)
60+
REFERENCES datadog_test_schemas.test_schema.cities(id)
61+
ON DELETE SET NULL;
6062
GO
6163

6264
-- Create table with unique constraint
@@ -73,7 +75,10 @@ CREATE TABLE datadog_test_schemas.test_schema.RestaurantReviews (
7375
RestaurantName VARCHAR(255),
7476
District VARCHAR(100),
7577
Review VARCHAR(MAX),
76-
CONSTRAINT FK_RestaurantNameDistrict FOREIGN KEY (RestaurantName, District) REFERENCES datadog_test_schemas.test_schema.Restaurants(RestaurantName, District)
78+
CONSTRAINT FK_RestaurantNameDistrict FOREIGN KEY (RestaurantName, District)
79+
REFERENCES datadog_test_schemas.test_schema.Restaurants(RestaurantName, District)
80+
ON DELETE CASCADE
81+
ON UPDATE SET NULL
7782
);
7883
GO
7984

sqlserver/tests/test_metadata.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,8 @@ def test_collect_schemas(aggregator, dd_run_check, dbm_instance):
239239
'referencing_column': 'city_id',
240240
'referenced_table': 'cities',
241241
'referenced_column': 'id',
242+
"delete_action": "SET_NULL",
243+
"update_action": "NO_ACTION",
242244
}
243245
],
244246
},
@@ -276,6 +278,8 @@ def test_collect_schemas(aggregator, dd_run_check, dbm_instance):
276278
'referencing_column': 'RestaurantName,District',
277279
'referenced_table': 'Restaurants',
278280
'referenced_column': 'RestaurantName,District',
281+
"delete_action": "CASCADE",
282+
"update_action": "SET_NULL",
279283
}
280284
],
281285
},

0 commit comments

Comments
 (0)