[SQL] 업데이트 트리거 후 SQL 서버
SQL업데이트 트리거 후 SQL 서버
나는이 트리거에 문제가 있습니다. 나는 요청 된 정보를 업데이트하는 데 싶습니다 유일한 문제의 행 (난 그냥 업데이트 된 것)이 아니라 전체 테이블에.
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())
어떻게이 단지 문제의 행에 적용되는 트리거를 알 수 있습니까?
해결법
-
==============================
1.여기 내 예는 테스트 이후
여기 내 예는 테스트 이후
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
삽입 된 특별한 테이블은 업데이트 된 레코드의 정보를 가지고 있습니다.
-
==============================
2.(하지 업데이트 한 후 갱신)이 시도
(하지 업데이트 한 후 갱신)이 시도
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
-
==============================
3.그렇게하는 것이 매우 간단합니다 먼저 당신의 희망을 위해 로그를 유지하는 것이 테이블의 복사본을 생성 예를 들어, 당신은 열 SalesOrderID에, 이름, 성, LASTMODIFIED 테이블 dbo.SalesOrder이
그렇게하는 것이 매우 간단합니다 먼저 당신의 희망을 위해 로그를 유지하는 것이 테이블의 복사본을 생성 예를 들어, 당신은 열 SalesOrderID에, 이름, 성, LASTMODIFIED 테이블 dbo.SalesOrder이
테이블 archieve 버전이 열 SalesOrderVersionArhieveId와 dbo.SalesOrderVersionArchieve, SalesOrderID에, 이름, 성, LASTMODIFIED해야한다
여기에 당신이 SalesOrder를 테이블에 트리거를 설정하는 방법입니다
USE [YOURDB] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: Karan Dhanu -- Create date: <Create Date,,> -- Description: <Description,,> -- ============================================= CREATE TRIGGER dbo.[CreateVersionArchiveRow] ON dbo.[SalesOrder] AFTER Update AS BEGIN SET NOCOUNT ON; INSERT INTO dbo.SalesOrderVersionArchive SELECT * FROM deleted; END
당신이 판매 주문 테이블에 어떤 변경하면 지금은 당신에게 VersionArchieve 테이블의 변화를 보여줍니다
-
==============================
4.당신은 삽입 된 테이블에 액세스 및 ID 또는 테이블의 기본 키를 검색 할 수 있어야한다. 이 예와 비슷한 뭔가 ...
당신은 삽입 된 테이블에 액세스 및 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
트리거를 사용하는 경우 다음 삽입 및 삭제 된 테이블에 대한 MSDN의 링크가 가능한 : http://msdn.microsoft.com/en-au/library/ms191300.aspx
-
==============================
5.이 해결 방법을 시도해보십시오.
이 해결 방법을 시도해보십시오.
DECLARE @Id INT DECLARE @field VARCHAR(50) SELECT @Id= INSERTED.CustomerId FROM INSERTED IF UPDATE(Name) BEGIN SET @field = 'Updated Name' END IF UPDATE(Country) BEGIN SET @field = 'Updated Country' END INSERT INTO CustomerLogs VALUES(@Id, @field) // OR -- If you wish to update existing table records. UPDATE YOUR_TABLE SET [FIELD]=[VALUE] WHERE {CONDITION}
나는 SQL 서버의 이전 버전에 이것을 확인하지 않았다 그러나 이것은 SQL 서버 2012와 함께 작동합니다.
-
==============================
6.첫째로, 당신은 이미 참조로 트리거는 테이블의 모든 레코드를 업데이트 할 예정이다. 나타나서 변경된 행을 달성하기 위해 수행 필터는 적용되지 않습니다.
첫째로, 당신은 이미 참조로 트리거는 테이블의 모든 레코드를 업데이트 할 예정이다. 나타나서 변경된 행을 달성하기 위해 수행 필터는 적용되지 않습니다.
둘째, 여러 행이 변경 될 수 있습니다로 잘못 일괄 처리 만 한 행 변경을 가정하고 있습니다.
제대로이 작업을 수행하는 방법은 가상 삽입 및 삭제 테이블을 사용하는 것입니다 : http://msdn.microsoft.com/en-us/library/ms191300.aspx
-
==============================
7.임시 테이블 TESTTEST을 만들려면이 스크립트를 시도하고 트리거가이 순서로 호출 될 때 우선 순위를 시계 : 1) INSTEAD OF, 2)의 경우, 3) AFTER를
임시 테이블 TESTTEST을 만들려면이 스크립트를 시도하고 트리거가이 순서로 호출 될 때 우선 순위를 시계 : 1) INSTEAD OF, 2)의 경우, 3) AFTER를
모든 논리 대신 OF 트리거에 배치하고 난 당신이 몇 가지 시나리오를 코딩하는 방법의 2 예를 ...
행운을 빕니다...
CREATE TABLE TESTTEST ( ID INT, Modified0 DATETIME, Modified1 DATETIME ) GO CREATE TRIGGER [dbo].[tr_TESTTEST_0] ON [dbo].TESTTEST INSTEAD OF INSERT,UPDATE,DELETE AS BEGIN SELECT 'INSTEAD OF' SELECT 'TT0.0' SELECT * FROM TESTTEST SELECT *, 'I' Mode INTO #work FROM INSERTED UPDATE #work SET Mode='U' WHERE ID IN (SELECT ID FROM DELETED) INSERT INTO #work (ID, Modified0, Modified1, Mode) SELECT ID, Modified0, Modified1, 'D' FROM DELETED WHERE ID NOT IN (SELECT ID FROM INSERTED) --Check Security or any other logic to add and remove from #work before processing DELETE FROM #work WHERE ID=9 -- because you don't want anyone to edit this id?!?! DELETE FROM #work WHERE Mode='D' -- because you don't want anyone to delete any records SELECT 'EV' SELECT * FROM #work IF(EXISTS(SELECT TOP 1 * FROM #work WHERE Mode='I')) BEGIN SELECT 'I0.0' INSERT INTO dbo.TESTTEST (ID, Modified0, Modified1) SELECT ID, Modified0, Modified1 FROM #work WHERE Mode='I' SELECT 'Cool stuff would happen here if you had FOR INSERT or AFTER INSERT triggers.' SELECT 'I0.1' END IF(EXISTS(SELECT TOP 1 * FROM #work WHERE Mode='D')) BEGIN SELECT 'D0.0' DELETE FROM TESTTEST WHERE ID IN (SELECT ID FROM #work WHERE Mode='D') SELECT 'Cool stuff would happen here if you had FOR DELETE or AFTER DELETE triggers.' SELECT 'D0.1' END IF(EXISTS(SELECT TOP 1 * FROM #work WHERE Mode='U')) BEGIN SELECT 'U0.0' UPDATE t SET t.Modified0=e.Modified0, t.Modified1=e.Modified1 FROM dbo.TESTTEST t INNER JOIN #work e ON e.ID = t.ID WHERE e.Mode='U' SELECT 'U0.1' END DROP TABLE #work SELECT 'TT0.1' SELECT * FROM TESTTEST END GO CREATE TRIGGER [dbo].[tr_TESTTEST_1] ON [dbo].TESTTEST FOR UPDATE AS BEGIN SELECT 'FOR UPDATE' SELECT 'TT1.0' SELECT * FROM TESTTEST SELECT 'I1' SELECT * FROM INSERTED SELECT 'D1' SELECT * FROM DELETED SELECT 'TT1.1' SELECT * FROM TESTTEST END GO CREATE TRIGGER [dbo].[tr_TESTTEST_2] ON [dbo].TESTTEST AFTER UPDATE AS BEGIN SELECT 'AFTER UPDATE' SELECT 'TT2.0' SELECT * FROM TESTTEST SELECT 'I2' SELECT * FROM INSERTED SELECT 'D2' SELECT * FROM DELETED SELECT 'TT2.1' SELECT * FROM TESTTEST END GO SELECT 'Start' INSERT INTO TESTTEST (ID, Modified0) VALUES (9, GETDATE())-- not going to insert SELECT 'RESTART' INSERT INTO TESTTEST (ID, Modified0) VALUES (10, GETDATE())--going to insert SELECT 'RESTART' UPDATE TESTTEST SET Modified1=GETDATE() WHERE ID=10-- gointo to update SELECT 'RESTART' DELETE FROM TESTTEST WHERE ID=10-- not going to DELETE SELECT 'FINISHED' SELECT * FROM TESTTEST DROP TABLE TESTTEST
-
==============================
8.당신은 INSERTED를 호출 할 수 있습니다, SQL Server는 키의 이름 아이디 전에 및 이벤트 occurs.I 후 테이블에 가정을 수정 된 행의 데이터를 캡처 이러한 테이블을 사용하여
당신은 INSERTED를 호출 할 수 있습니다, SQL Server는 키의 이름 아이디 전에 및 이벤트 occurs.I 후 테이블에 가정을 수정 된 행의 데이터를 캡처 이러한 테이블을 사용하여
나는 다음과 같은 코드가 당신을 도울 수 있다고 생각
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
-
==============================
9.
CREATE TRIGGER [dbo].[after_update] ON [dbo].[MYTABLE] AFTER UPDATE AS BEGIN DECLARE @ID INT SELECT @ID = D.ID FROM inserted D UPDATE MYTABLE SET mytable.CHANGED_ON = GETDATE() ,CHANGED_BY = USER_NAME(USER_ID()) WHERE ID = @ID END
from https://stackoverflow.com/questions/25568526/sql-server-after-update-trigger by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] C #에서 SQL을 대량 복사 / 삽입 (0) | 2020.07.05 |
---|---|
[SQL] 모든 칼럼에 null 값 (들)의 모든 행을 찾기 (0) | 2020.07.05 |
[SQL] PostgreSQL의 SERIAL 작업 다르게합니까? (0) | 2020.07.05 |
[SQL] 인서트 문자열은 사용자 생성 된 변수에있을 때 SQL 삽입에 대한 작은 따옴표를 ... 탈출하는 방법 (0) | 2020.07.05 |
[SQL] C #의 WinForm에서의 app.config를 사용하여 데이터베이스 연결 문자열에 액세스 (0) | 2020.07.05 |