2010-09-27 35 views
0

我需要在不知道主鍵列的名稱的情況下更新DateModified列。在UPDATE觸發器中 - 獲取沒有列名的主鍵

基本上,我有一個純簡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 

但不知道主鍵的列名,因爲觸發器將被編程(see this question as to why)產生。

這可能嗎?

+1

Y如果PK有多個列,我們的觸發器將不起作用。您可以使用EXISTS()而不是IN()。 – 2010-09-27 19:10:31

+0

您可以使用'INFORMATION_SCHEMA.TABLE_CONSTRAINTS'視圖和'INFORMATION_SCHEMA.KEY_COLUMN_USAGE'視圖獲取PK列 – 2010-09-27 19:19:19

回答

2

好的,也許我有點不公平,把這部分留作前面問題的「練習題」。

這將適用於具有單列PK的表格。從這些開始可能是最簡單的,然後返回並用複合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 
0

好吧,我只是通過一些系統視圖,並沒有看到任何告訴你每個表的主鍵是什麼。你可能需要手工完成。

+1

它們很明顯:'select * from sys.objects where type ='PK'' – Andomar 2010-09-27 19:38:49

+0

aha!我知道這是某處,我找不到它。 – DForck42 2010-09-27 19:52:28

1

如果你能夠建立你所有的主鍵從身份列:

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

+1。實際上,所有的PK都是IsIdentity,但是Joe會打敗你,而他的代碼就是我用過的。 – 2010-09-27 21:24:20