You could adapt the key_column_usage view and incorporate your own join, but.....
SELECT db_name() AS CONSTRAINT_CATALOG, user_name(c_obj.uid) AS CONSTRAINT_SCHEMA, c_obj.name AS CONSTRAINT_NAME, db_name()
AS TABLE_CATALOG, user_name(t_obj.uid) AS TABLE_SCHEMA, t_obj.name AS TABLE_NAME, col.name AS COLUMN_NAME,
CASE col.colid WHEN ref.fkey1 THEN 1 WHEN ref.fkey2 THEN 2 WHEN ref.fkey3 THEN 3 WHEN ref.fkey4 THEN 4 WHEN ref.fkey5 THEN 5 WHEN ref.fkey6
THEN 6 WHEN ref.fkey7 THEN 7 WHEN ref.fkey8 THEN 8 WHEN ref.fkey9 THEN 9 WHEN ref.fkey10 THEN 10 WHEN ref.fkey11 THEN 11 WHEN ref.fkey12
THEN 12 WHEN ref.fkey13 THEN 13 WHEN ref.fkey14 THEN 14 WHEN ref.fkey15 THEN 15 WHEN ref.fkey16 THEN 16 END AS ORDINAL_POSITION
FROM sysobjects c_obj, sysobjects t_obj, syscolumns col, sysreferences ref
WHERE permissions(t_obj.id) != 0 AND c_obj.xtype IN ('F ') AND t_obj.id = c_obj.parent_obj AND t_obj.id = col.id AND col.colid IN (ref.fkey1, ref.fkey2, ref.fkey3,
ref.fkey4, ref.fkey5, ref.fkey6, ref.fkey7, ref.fkey8, ref.fkey9, ref.fkey10, ref.fkey11, ref.fkey12, ref.fkey13, ref.fkey14, ref.fkey15, ref.fkey16) AND
c_obj.id = ref.constid
UNION
SELECT db_name() AS CONSTRAINT_CATALOG, user_name(c_obj.uid) AS CONSTRAINT_SCHEMA, i.name AS CONSTRAINT_NAME, db_name()
AS TABLE_CATALOG, user_name(t_obj.uid) AS TABLE_SCHEMA, t_obj.name AS TABLE_NAME, col.name AS COLUMN_NAME,
v.number AS ORDINAL_POSITION
FROM sysobjects c_obj, sysobjects t_obj, syscolumns col, master.dbo.spt_values v, sysindexes i
WHERE permissions(t_obj.id) != 0 AND c_obj.xtype IN ('UQ', 'PK') AND t_obj.id = c_obj.parent_obj AND t_obj.xtype = 'U' AND t_obj.id = col.id AND
col.name = index_col(t_obj.name, i.indid, v.number) AND t_obj.id = i.id AND c_obj.name = i.name AND v.number > 0 AND v.number <= i.keycnt AND
v.type = 'P'
Thats the key_column_usage view definition!! |-0
What about flagging them in the triggers and running a scheduled task provided you don't need immediate updating