use*_*897 17 sql t-sql sql-server sql-server-express sql-server-2014
这个触发器有问题.我希望它只将所请求的信息更新到有问题的行(我刚刚更新的那个)而不是整个表.
CREATE TRIGGER [dbo].[after_update]
ON [dbo].[MYTABLE]
AFTER UPDATE
AS
BEGIN
UPDATE MYTABLE
SET mytable.CHANGED_ON = GETDATE(),
CHANGED_BY=USER_NAME(USER_ID())
Run Code Online (Sandbox Code Playgroud)
如何告诉触发器这仅适用于相关行?
Jua*_*uan 17
这是测试后的例子
CREATE TRIGGER [dbo].UpdateTasadoresName
ON [dbo].Tasadores
FOR UPDATE
AS
UPDATE Tasadores
SET NombreCompleto = RTRIM( Tasadores.Nombre + ' ' + isnull(Tasadores.ApellidoPaterno,'') + ' ' + isnull(Tasadores.ApellidoMaterno,'') )
FROM Tasadores
INNER JOIN INSERTED i ON Tasadores.id = i.id
Run Code Online (Sandbox Code Playgroud)
插入的特殊表将包含更新记录中的信息.
小智 6
试试这个(更新,而不是更新后)
CREATE TRIGGER [dbo].[xxx_update] ON [dbo].[MYTABLE]
FOR UPDATE
AS
BEGIN
UPDATE MYTABLE
SET mytable.CHANGED_ON = GETDATE()
,CHANGED_BY = USER_NAME(USER_ID())
FROM inserted
WHERE MYTABLE.ID = inserted.ID
END
Run Code Online (Sandbox Code Playgroud)
你可以调用INSERTED
,SQL Server使用这些表来捕获事件发生之前和之后修改行的数据。我假设在你的表中键的名称是Id
我认为下面的代码可以帮助你
CREATE TRIGGER [dbo].[after_update]
ON [dbo].[MYTABLE]
AFTER UPDATE
AS
BEGIN
UPDATE dbo.[MYTABLE]
SET dbo.[MYTABLE].CHANGED_ON = GETDATE(),
dbo.[MYTABLE].CHANGED_BY = USER_NAME(USER_ID())
FROM INSERTED
WHERE INSERTED.Id = dbo.[MYTABLE].[Id]
END
Run Code Online (Sandbox Code Playgroud)
您应该能够访问该INSERTED
表并检索 ID 或表的主键。与这个例子类似的东西......
CREATE TRIGGER [dbo].[after_update] ON [dbo].[MYTABLE]
AFTER UPDATE AS
BEGIN
DECLARE @id AS INT
SELECT @id = [IdColumnName]
FROM INSERTED
UPDATE MYTABLE
SET mytable.CHANGED_ON = GETDATE(),
CHANGED_BY=USER_NAME(USER_ID())
WHERE [IdColumnName] = @id
Run Code Online (Sandbox Code Playgroud)
INSERTED
以下是 MSDN 上关于使用触发器时可用的和表的链接DELETED
:http://msdn.microsoft.com/en-au/library/ms191300.aspx