Многостоловые триггеры SQL Server noob - PullRequest
4 голосов
/ 12 апреля 2010

У меня есть множество таблиц с одинаковыми 2 столбцами datetime (lastModDate, dateAdded). Мне интересно, могу ли я установить глобальный триггер Вставить обновление для этих таблиц, чтобы установить значения даты и времени. Или, если нет, какие есть подходы?

Любые указатели высоко ценится

Ответы [ 5 ]

3 голосов
/ 12 апреля 2010

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

Что-то вроде: http://weblogs.sqlteam.com/brettk/archive/2006/11/29/35816.aspx

2 голосов
/ 11 мая 2014

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

2 голосов
/ 12 апреля 2010

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

1 голос
/ 12 апреля 2010

Можно использовать значения DEFAULT для вставок (dateAdded) и триггер TABLE для UPDATE.

Что-то вроде

CREATE TABLE MyTable (
        ID INT,
        Val VARCHAR(10),
        lastModDate DATETIME DEFAULT CURRENT_TIMESTAMP, 
        dateAdded DATETIME DEFAULT CURRENT_TIMESTAMP
)
GO

CREATE TRIGGER MyTableUpdate ON MyTable
FOR UPDATE
AS
UPDATE  MyTable
SET     lastModDate = CURRENT_TIMESTAMP
FROM    MyTable mt INNER JOIN
        inserted i ON mt.ID = i.ID
GO

INSERT INTO MyTable (ID, Val) SELECT 1, 'A'
GO

SELECT *
FROM MyTable
GO

UPDATE MyTable
SET Val = 'B' 
WHERE ID = 1
GO

SELECT *
FROM MyTable
GO

DROP TABLE MyTable
GO
0 голосов
/ 10 апреля 2013

Генерация триггеров для всех таблиц

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

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

Наслаждайтесь

USE Northwind GO

CREATE TABLE LOG_TABLE (Add_dttm datetime DEFAULT (GetDate()),
TABLE_NAME sysname, Activity char(6)) GO

DECLARE @sql varchar(8000), @TABLE_NAME sysname SET NOCOUNT ON

SELECT @TABLE_NAME = MIN(TABLE_NAME) FROM INFORMATION_SCHEMA.Tables

WHILE @TABLE_NAME IS NOT NULL   BEGIN  SELECT @sql = 'CREATE TRIGGER
[' + @TABLE_NAME + '_Usage_TR] ON [' + @TABLE_NAME +'] '   + 'FOR
INSERT, UPDATE, DELETE AS '   + 'IF EXISTS (SELECT * FROM inserted)
AND NOT EXISTS (SELECT * FROM deleted) '   + 'INSERT INTO LOG_TABLE
(TABLE_NAME,Activity) SELECT ''' + @TABLE_NAME + ''', ''INSERT''' + '
'   + 'IF EXISTS (SELECT * FROM inserted) AND EXISTS (SELECT * FROM
deleted) '   + 'INSERT INTO LOG_TABLE (TABLE_NAME,Activity) SELECT '''
+ @TABLE_NAME + ''', ''UPDATE''' + ' '   + 'IF NOT EXISTS (SELECT * FROM inserted) AND EXISTS (SELECT * FROM deleted) '   + 'INSERT INTO
LOG_TABLE (TABLE_NAME,Activity) SELECT ''' + @TABLE_NAME + ''',
''DELETE''' + ' GO'  SELECT @sql  EXEC(@sql)  SELECT @TABLE_NAME =
MIN(TABLE_NAME) FROM INFORMATION_SCHEMA.Tables WHERE TABLE_NAME >
@TABLE_NAME    END SET NOCOUNT OFF
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...