В триггере UPDATE - получить первичный ключ без имени столбца - PullRequest
0 голосов
/ 27 сентября 2010

Мне нужно обновить столбец DateModified, не зная имени столбца первичного ключа.

По сути, у меня есть триггер UPDATE с простым заголовком, например:

CREATE TRIGGER updated_SCHEMA_TABLE
 ON [SCHEMA].[TABLE]
   AFTER UPDATE AS 
     BEGIN 
       SET NOCOUNT ON; 
       UPDATE [SCHEMA].[TABLE] 
       SET DateModified = getdate() 
       WHERE [PRIMARYKEY]
       IN (SELECT [PRIMARYKEY]
       FROM Inserted)
     END

но не будет знать имя столбца первичного ключа, потому что триггер будет сгенерирован программно ( см. этот вопрос, почему ).

Возможно ли это?

Ответы [ 3 ]

2 голосов
/ 27 сентября 2010

Хорошо, возможно, я был немного несправедлив, оставив эту часть в качестве "упражнения" в предыдущем вопросе.

Это будет работать для таблиц с одним столбцом PK. Возможно, было бы проще начать с них, а затем вернуться назад и вручную настроить их с помощью составного ПК.

select 'create trigger updated_'+s.name + '_' + t.name + ' on  ' + quotename(s.name) + '.' + quotename(t.name) 
       + ' after update as'
       + ' begin '
       + ' set nocount on; '
       + ' update t'
       + '     set [DateModified] = getdate()'
       + '     from inserted i'
       + '         inner join ' + quotename(s.name) + '.' + quotename(t.name) + ' t'
       + '             on i.' + quotename(c2.name) + ' = t.' + quotename(c2.name)
       + ' end'
    from sys.columns c
        inner join sys.tables t
            on c.object_id = t.object_id
        inner join sys.schemas s
            on t.schema_id = s.schema_id
        inner join sys.indexes i
            on t.object_id = i.object_id
        inner join sys.index_columns ic
            on i.object_id = ic.object_id
                and i.index_id = ic.index_id
        inner join sys.columns c2
            on ic.object_id = c2.object_id
                and ic.index_id = c2.column_id
    where c.name = 'DateModified'
        and t.type = 'U'
        and i.is_primary_key = 1
1 голос
/ 27 сентября 2010

Если вы смогли собрать все свои первичные ключи из столбцов идентификации:

SELECT table_name, column_name
FROM INFORMATION_SCHEMA.COLUMNS
where COLUMNPROPERTY (OBJECT_ID(Table_Name),Column_Name,'IsIdentity') = 1
 and table_schema = [SCHEMA] and table_name = [TABLE]

в противном случае вам придется просматривать индексы, используя все таблицы sys (хорошая работа, Джо).

0 голосов
/ 27 сентября 2010

хорошо, я просто быстро изучил некоторые системные представления и не вижу ничего, что говорило бы о первичных ключах для каждой таблицы. вам, возможно, придется сделать это вручную.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...