Insert Update 트리거 삽입 또는 업데이트 여부를 확인하는 방법
테이블 A에 Insert, Update Trigger를 써야 합니다.테이블 A의 컬럼에 삽입/업데이트된 값(Col1)이 있는 테이블 B의 모든 행을 삭제합니다.업데이트 및 삽입 사례를 모두 처리할 수 있도록 작성하려면 어떻게 해야 합니까?트리거가 업데이트 또는 삽입에 대해 실행되는지 여부를 확인하려면 어떻게 해야 합니까?
에는 특별한 기호가 .INSERTED
★★★★★★★★★★★★★★★★★」DELETED
"추적하기 입니다.전" 및 "후" 데이터를 추적하기 위한 표입니다. 이렇게 '어울릴 수, 수, 수, 수, 수, 수, 수, 수, 수, 수, 수, 수, 수, 수, 수, 수, 수, 수, 수 등.IF EXISTS (SELECT * FROM DELETED)
업데이트를 검출합니다.요.DELETED
in on on데 on 、 on on 、 on on 、 in in in in on 。INSERTED
.
CREATE 트리거에서 "삽입"을 찾습니다.
편집, 2011년 11월 23일
코멘트, 이은 「 」, 「 」, 「 」, 「 」만을으로 하고 .INSERTED
★★★★★★★★★★★★★★★★★」UPDATED
리거합합니니다
이 "DELETE"에 있을 수 .INSERTED
에서 말한 바와
CREATE TRIGGER dbo.TableName_IUD
ON dbo.TableName
AFTER INSERT, UPDATE, DELETE
AS
BEGIN
SET NOCOUNT ON;
--
-- Check if this is an INSERT, UPDATE or DELETE Action.
--
DECLARE @action as char(1);
SET @action = 'I'; -- Set Action to Insert by default.
IF EXISTS(SELECT * FROM DELETED)
BEGIN
SET @action =
CASE
WHEN EXISTS(SELECT * FROM INSERTED) THEN 'U' -- Set Action to Updated.
ELSE 'D' -- Set Action to Deleted.
END
END
ELSE
IF NOT EXISTS(SELECT * FROM INSERTED) RETURN; -- Nothing updated or inserted.
...
END
아무것도 삭제하지 않는 delete 문을 실행하는 경우 이러한 제안의 대부분은 고려되지 않습니다.
ID가 테이블에 존재하지 않는 값과 동일한 경우 삭제를 시도한다고 가정합니다.
트리거는 계속 호출되지만 Deleted 테이블 또는 Inserted 테이블에는 아무것도 없습니다.
안전을 위해 다음과 같이 하십시오.
--Determine if this is an INSERT,UPDATE, or DELETE Action or a "failed delete".
DECLARE @Action as char(1);
SET @Action = (CASE WHEN EXISTS(SELECT * FROM INSERTED)
AND EXISTS(SELECT * FROM DELETED)
THEN 'U' -- Set Action to Updated.
WHEN EXISTS(SELECT * FROM INSERTED)
THEN 'I' -- Set Action to Insert.
WHEN EXISTS(SELECT * FROM DELETED)
THEN 'D' -- Set Action to Deleted.
ELSE NULL -- Skip. It may have been a "failed delete".
END)
@KenDog @Net_Prog 。
이건 그들의 대본으로 만든 거야
다음을 사용하고 있습니다.또, 아무것도 삭제하지 않는 delete 스테이트먼트도 올바르게 검출됩니다.
CREATE TRIGGER dbo.TR_TableName_TriggerName
ON dbo.TableName
AFTER INSERT, UPDATE, DELETE
AS
BEGIN
SET NOCOUNT ON;
IF NOT EXISTS(SELECT * FROM INSERTED)
-- DELETE
PRINT 'DELETE';
ELSE
BEGIN
IF NOT EXISTS(SELECT * FROM DELETED)
-- INSERT
PRINT 'INSERT';
ELSE
-- UPDATE
PRINT 'UPDATE';
END
END;
Declare @Type varchar(50)='';
IF EXISTS (SELECT * FROM inserted) and EXISTS (SELECT * FROM deleted)
BEGIN
SELECT @Type = 'UPDATE'
END
ELSE IF EXISTS(SELECT * FROM inserted)
BEGIN
SELECT @Type = 'INSERT'
END
ElSE IF EXISTS(SELECT * FROM deleted)
BEGIN
SELECT @Type = 'DELETE'
END
네스트된 if가 좀 헷갈리고
플랫이 네스트보다 낫다 [파이썬의 젠]
;)
DROP TRIGGER IF EXISTS AFTER_MYTABLE
GO
CREATE TRIGGER dbo.AFTER_MYTABLE ON dbo.MYTABLE AFTER INSERT, UPDATE, DELETE
AS BEGIN
--- FILL THE BEGIN/END SECTION FOR YOUR NEEDS.
SET NOCOUNT ON;
IF EXISTS(SELECT * FROM INSERTED) AND EXISTS(SELECT * FROM DELETED)
BEGIN PRINT 'UPDATE' END
ELSE IF EXISTS(SELECT * FROM INSERTED) AND NOT EXISTS(SELECT * FROM DELETED)
BEGIN PRINT 'INSERT' END
ELSE IF EXISTS(SELECT * FROM DELETED) AND NOT EXISTS(SELECT * FROM INSERTED)
BEGIN PRINT 'DELETED' END
ELSE BEGIN PRINT 'NOTHING CHANGED'; RETURN; END -- NOTHING
END
여러 번 검색한 결과 트리거 액션 INSERT, UPDATE 및 DELETE의 3가지 조건을 모두 처리하는 단일 SQL Server 트리거의 정확한 예를 찾을 수 없었습니다.드디어 DELETE 또는 UPDATE가 발생했을 때 공통의 DELETED 테이블에 이 두 가지 액션에 대한 레코드가 포함되어 있다는 사실을 설명하는 텍스트 행을 찾았습니다.그런 다음 이 정보를 바탕으로 트리거가 활성화된 이유를 확인하는 작은 Action 루틴을 만들었습니다.INSERT vs. UPDATE 트리거에서 공통 설정과 특정 액션이 모두 발생할 경우 이러한 유형의 인터페이스가 필요할 수 있습니다.이 경우 UPDATE 및 INSERT에 대해 별도의 트리거를 생성하면 유지 보수 문제가 발생합니다.(즉, 두 트리거 모두 필요한 공통 데이터 알고리즘 수정을 위해 적절히 업데이트되었습니까?)
이를 위해 Microsoft SQL Server의 INSERT, UPDATE, DELETE를 하나의 트리거로 처리하기 위한 다음 멀티 트리거 이벤트 코드 스니펫을 드립니다.
CREATE TRIGGER [dbo].[INSUPDDEL_MyDataTable]
ON [dbo].[MyDataTable] FOR INSERT, UPDATE, DELETE
AS
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with caller queries SELECT statements.
-- If an update/insert/delete occurs on the main table, the number of records affected
-- should only be based on that table and not what records the triggers may/may not
-- select.
SET NOCOUNT ON;
--
-- Variables Needed for this Trigger
--
DECLARE @PACKLIST_ID varchar(15)
DECLARE @LINE_NO smallint
DECLARE @SHIPPED_QTY decimal(14,4)
DECLARE @CUST_ORDER_ID varchar(15)
--
-- Determine if this is an INSERT,UPDATE, or DELETE Action
--
DECLARE @Action as char(1)
DECLARE @Count as int
SET @Action = 'I' -- Set Action to 'I'nsert by default.
SELECT @Count = COUNT(*) FROM DELETED
if @Count > 0
BEGIN
SET @Action = 'D' -- Set Action to 'D'eleted.
SELECT @Count = COUNT(*) FROM INSERTED
IF @Count > 0
SET @Action = 'U' -- Set Action to 'U'pdated.
END
if @Action = 'D'
-- This is a DELETE Record Action
--
BEGIN
SELECT @PACKLIST_ID =[PACKLIST_ID]
,@LINE_NO = [LINE_NO]
FROM DELETED
DELETE [dbo].[MyDataTable]
WHERE [PACKLIST_ID]=@PACKLIST_ID AND [LINE_NO]=@LINE_NO
END
Else
BEGIN
--
-- Table INSERTED is common to both the INSERT, UPDATE trigger
--
SELECT @PACKLIST_ID =[PACKLIST_ID]
,@LINE_NO = [LINE_NO]
,@SHIPPED_QTY =[SHIPPED_QTY]
,@CUST_ORDER_ID = [CUST_ORDER_ID]
FROM INSERTED
if @Action = 'I'
-- This is an Insert Record Action
--
BEGIN
INSERT INTO [MyChildTable]
(([PACKLIST_ID]
,[LINE_NO]
,[STATUS]
VALUES
(@PACKLIST_ID
,@LINE_NO
,'New Record'
)
END
else
-- This is an Update Record Action
--
BEGIN
UPDATE [MyChildTable]
SET [PACKLIST_ID] = @PACKLIST_ID
,[LINE_NO] = @LINE_NO
,[STATUS]='Update Record'
WHERE [PACKLIST_ID]=@PACKLIST_ID AND [LINE_NO]=@LINE_NO
END
END
@Alex가 올린 답변도 마음에 들지만 위의 @Graham의 솔루션에 대해 이 변형을 제안합니다.
첫 번째 테스트에서는 COLUMNS_UPDATED를 사용하는 것이 아니라 INSERTED 및 UPDATED 테이블의 레코드 존재만을 사용합니다.또한 편집증적인 프로그래머에게 마지막 사건이 고려된 것을 알 수 있는 안도감을 준다.
declare @action varchar(4)
IF EXISTS (SELECT * FROM INSERTED)
BEGIN
IF EXISTS (SELECT * FROM DELETED)
SET @action = 'U' -- update
ELSE
SET @action = 'I' --insert
END
ELSE IF EXISTS (SELECT * FROM DELETED)
SET @action = 'D' -- delete
else
set @action = 'noop' --no records affected
--print @action
다음과 같은 문장으로 NOP를 받습니다.
update tbl1 set col1='cat' where 1=2
DECLARE @ActionType CHAR(6);
SELECT @ActionType = COALESCE(CASE WHEN EXISTS(SELECT * FROM INSERTED)
AND EXISTS(SELECT * FROM DELETED) THEN 'UPDATE' END,
CASE WHEN EXISTS(SELECT * FROM DELETED) THEN 'DELETE' END,
CASE WHEN EXISTS(SELECT * FROM INSERTED) THEN 'INSERT' END);
PRINT @ActionType;
이거 드셔보세요.
ALTER TRIGGER ImportacionesGS ON dbo.Compra
AFTER INSERT, UPDATE, DELETE
AS
BEGIN
-- idCompra is PK
DECLARE @vIdCompra_Ins INT,@vIdCompra_Del INT
SELECT @vIdCompra_Ins=Inserted.idCompra FROM Inserted
SELECT @vIdCompra_Del=Deleted.idCompra FROM Deleted
IF (@vIdCompra_Ins IS NOT NULL AND @vIdCompra_Del IS NULL)
Begin
-- Todo Insert
End
IF (@vIdCompra_Ins IS NOT NULL AND @vIdCompra_Del IS NOT NULL)
Begin
-- Todo Update
End
IF (@vIdCompra_Ins IS NULL AND @vIdCompra_Del IS NOT NULL)
Begin
-- Todo Delete
End
END
이 방법이 더 빠를 수 있습니다.
DECLARE @action char(1)
IF COLUMNS_UPDATED() > 0 -- insert or update
BEGIN
IF EXISTS (SELECT * FROM DELETED) -- update
SET @action = 'U'
ELSE
SET @action = 'I'
END
ELSE -- delete
SET @action = 'D'
Grahams 이외의 쿨 솔루션에서 작은 오류를 발견했습니다.
IF COLUMNS_UPDATED() <> 0 -- insert or update 입니다.
상위 비트가 SIGNED 정수 부호 비트...(?)로 해석되기 때문일 수 있습니다.★★★★
DECLARE @action CHAR(8)
IF COLUMNS_UPDATED() <> 0 -- delete or update?
BEGIN
IF EXISTS (SELECT * FROM deleted) -- updated cols + old rows means action=update
SET @action = 'UPDATE'
ELSE
SET @action = 'INSERT' -- updated columns and nothing deleted means action=insert
END
ELSE -- delete
BEGIN
SET @action = 'DELETE'
END
제공되는 두 가지 솔루션의 잠재적인 문제는 기술 방법에 따라 업데이트 쿼리가 0 레코드를 갱신하고 삽입 쿼리가 0 레코드를 삽입할 수 있다는 것입니다.이 경우 삽입된 레코드 세트와 삭제된 레코드 세트가 비어 있습니다.대부분의 경우 삽입 레코드 세트와 삭제된 레코드 세트가 모두 비어 있는 경우 아무 작업 없이 트리거를 종료할 수 있습니다.
declare @insCount int
declare @delCount int
declare @action char(1)
select @insCount = count(*) from INSERTED
select @delCount = count(*) from DELETED
if(@insCount > 0 or @delCount > 0)--if something was actually affected, otherwise do nothing
Begin
if(@insCount = @delCount)
set @action = 'U'--is update
else if(@insCount > 0)
set @action = 'I' --is insert
else
set @action = 'D' --is delete
--do stuff here
End
이게 내 마음을 사로잡는다.
declare @action_type int;
select @action_type = case
when i.id is not null and d.id is null then 1 -- insert
when i.id is not null and d.id is not null then 2 -- update
when i.id is null and d.id is not null then 3 -- delete
end
from inserted i
full join deleted d on d.id = i.id
한 번에 모든 열을 업데이트할 수 있는 것은 아니기 때문에 다음과 같은 방법으로 특정 열이 업데이트되고 있는지 여부를 확인할 수 있습니다.
IF UPDATE([column_name])
간단한 방법
CREATE TRIGGER [dbo].[WO_EXECUTION_TRIU_RECORD] ON [dbo].[WO_EXECUTION]
WITH EXECUTE AS CALLER
FOR INSERT, UPDATE
AS
BEGIN
select @vars = [column] from inserted
IF UPDATE([column]) BEGIN
-- do update action base on @vars
END ELSE BEGIN
-- do insert action base on @vars
END
END
저는 "컴퓨터 과학이 우아한" 솔루션이 좋습니다.이 솔루션에서는 [inserted]와 [deleted]의 의사 테이블을 각각1개씩 눌러 상태를 취득하고 그 결과를 비트맵 변수에 넣습니다.그런 다음 INSERT, UPDATE 및 DELETE의 가능한 각 조합은 효율적인 바이너리 평가를 통해 트리거 전체에서 쉽게 테스트할 수 있습니다(가능성이 낮은 INSERT 또는 DELETE 조합 제외).
행이 변경되지 않은 경우(대부분의 경우를 만족시킬 수 있음) DML 문장이 무엇이었는지는 중요하지 않다고 가정합니다.따라서 Roman Pekar의 솔루션만큼 완전하지는 않지만 더 효율적입니다.
이 접근방식에서는 테이블당 1개의 "FOR INSERT, UPDATE, DELETE" 트리거를 사용할 수 있으며, A) 액션 순서를 완전히 제어하고 b) 멀티 액션 적용 가능한 액션당 1개의 코드 구현을 가능하게 합니다. (분명히,모든 구현 모델에는 장단점이 있습니다.사용하는 시스템을 개별적으로 평가하여 최적의 기능을 얻을 필요가 있습니다.)
"disk (select * from "/select "/select " from "/select ")" 스테이트먼트는 디스크액세스가 없기 때문에 매우 효율적입니다(https://social.msdn.microsoft.com/Forums/en-US/01744422-23fe-42f6-9ab0-a255cdf2904a)).
use tempdb
;
create table dbo.TrigAction (asdf int)
;
GO
create trigger dbo.TrigActionTrig
on dbo.TrigAction
for INSERT, UPDATE, DELETE
as
declare @Action tinyint
;
-- Create bit map in @Action using bitwise OR "|"
set @Action = (-- 1: INSERT, 2: DELETE, 3: UPDATE, 0: No Rows Modified
(select case when exists (select * from inserted) then 1 else 0 end)
| (select case when exists (select * from deleted ) then 2 else 0 end))
;
-- 21 <- Binary bit values
-- 00 -> No Rows Modified
-- 01 -> INSERT -- INSERT and UPDATE have the 1 bit set
-- 11 -> UPDATE <
-- 10 -> DELETE -- DELETE and UPDATE have the 2 bit set
raiserror(N'@Action = %d', 10, 1, @Action) with nowait
;
if (@Action = 0) raiserror(N'No Data Modified.', 10, 1) with nowait
;
-- do things for INSERT only
if (@Action = 1) raiserror(N'Only for INSERT.', 10, 1) with nowait
;
-- do things for UPDATE only
if (@Action = 3) raiserror(N'Only for UPDATE.', 10, 1) with nowait
;
-- do things for DELETE only
if (@Action = 2) raiserror(N'Only for DELETE.', 10, 1) with nowait
;
-- do things for INSERT or UPDATE
if (@Action & 1 = 1) raiserror(N'For INSERT or UPDATE.', 10, 1) with nowait
;
-- do things for UPDATE or DELETE
if (@Action & 2 = 2) raiserror(N'For UPDATE or DELETE.', 10, 1) with nowait
;
-- do things for INSERT or DELETE (unlikely)
if (@Action in (1,2)) raiserror(N'For INSERT or DELETE.', 10, 1) with nowait
-- if already "return" on @Action = 0, then use @Action < 3 for INSERT or DELETE
;
GO
set nocount on;
raiserror(N'
INSERT 0...', 10, 1) with nowait;
insert dbo.TrigAction (asdf) select top 0 object_id from sys.objects;
raiserror(N'
INSERT 3...', 10, 1) with nowait;
insert dbo.TrigAction (asdf) select top 3 object_id from sys.objects;
raiserror(N'
UPDATE 0...', 10, 1) with nowait;
update t set asdf = asdf /1 from dbo.TrigAction t where asdf <> asdf;
raiserror(N'
UPDATE 3...', 10, 1) with nowait;
update t set asdf = asdf /1 from dbo.TrigAction t;
raiserror(N'
DELETE 0...', 10, 1) with nowait;
delete t from dbo.TrigAction t where asdf < 0;
raiserror(N'
DELETE 3...', 10, 1) with nowait;
delete t from dbo.TrigAction t;
GO
drop table dbo.TrigAction
;
GO
빠른 솔루션 MySQL
참고로 MySQL PDO를 사용하고 있습니다.
(1) 자동 증분 테이블에서는 모든 스크립트가 먼저 실행되면 증분된 열에서 가장 높은 값(내 열 이름 = id)을 얻습니다.
$select = "
SELECT MAX(id) AS maxid
FROM [tablename]
LIMIT 1
";
(2) 정상적으로 MySQL 쿼리를 실행하고 결과를 정수로 캐스트합니다.예를 들어 다음과 같습니다.
$iMaxId = (int) $result[0]->maxid;
(3) '삽입처' 후중복 키 업데이트" 쿼리는 원하는 방법으로 마지막으로 삽입된 ID를 가져옵니다.다음은 예를 제시하겠습니다.
$iLastInsertId = (int) $db->lastInsertId();
(4) 비교 및 반응:lastInsertId가 테이블에서 가장 높은 값보다 크면 아마도 INSERT일 것입니다.그리고 역도 성립.
if ($iLastInsertId > $iMaxObjektId) {
// IT'S AN INSERT
}
else {
// IT'S AN UPDATE
}
빠르고 지저분하다는 거 알아오래된 포스트입니다.하지만, 이봐, 난 오랫동안 해결책을 찾고 있었어. 그리고 누군가 내 방법이 유용하다고 생각할지도 몰라.좋은 일만 가득하시길요!
첫 번째 시나리오에서는 Identity 컬럼이 테이블에 있다고 가정했습니다.
CREATE TRIGGER [dbo].[insupddel_yourTable] ON [yourTable]
FOR INSERT, UPDATE, DELETE
AS
IF @@ROWCOUNT = 0 return
SET NOCOUNT ON;
DECLARE @action nvarchar(10)
SELECT @action = CASE WHEN COUNT(i.Id) > COUNT(d.Id) THEN 'inserted'
WHEN COUNT(i.Id) < COUNT(d.Id) THEN 'deleted' ELSE 'updated' END
FROM inserted i FULL JOIN deleted d ON i.Id = d.Id
두 번째 시나리오에서는 IDITY 열을 사용할 필요가 없습니다.
CREATE TRIGGER [dbo].[insupddel_yourTable] ON [yourTable]
FOR INSERT, UPDATE, DELETE
AS
IF @@ROWCOUNT = 0 return
SET NOCOUNT ON;
DECLARE @action nvarchar(10),
@insCount int = (SELECT COUNT(*) FROM inserted),
@delCount int = (SELECT COUNT(*) FROM deleted)
SELECT @action = CASE WHEN @insCount > @delCount THEN 'inserted'
WHEN @insCount < @delCount THEN 'deleted' ELSE 'updated' END
DECLARE @INSERTEDCOUNT INT,
@DELETEDCOUNT INT
SELECT @INSERTEDCOUNT = COUNT([YourColumnName]) FROM inserted
SELECT @DELETEDCOUNT = COUNT([YourColumnName]) FROM deleted
IF의 갱신
@INSERTEDCOUNT = 1
@DELETEDCOUNT = 1
그것이 삽입되면
@INSERTEDCOUNT = 1
@DELETEDCOUNT = 0
나는 그것들을 사용했다.exists (select * from inserted/deleted)
장시간 쿼리하지만 빈 CRUD 작업에는 여전히 부족합니다(에 레코드가 없는 경우).inserted
그리고.deleted
표)를 참조해 주세요.이 토픽을 조금 조사한 결과, 보다 정확한 해결책을 찾았습니다.
declare
@columns_count int = ?? -- number of columns in the table,
@columns_updated_count int = 0
-- this is kind of long way to get number of actually updated columns
-- from columns_updated() mask, it's better to create helper table
-- or at least function in the real system
with cte_columns as (
select @columns_count as n
union all
select n - 1 from cte_columns where n > 1
), cte_bitmasks as (
select
n,
(n - 1) / 8 + 1 as byte_number,
power(2, (n - 1) % 8) as bit_mask
from cte_columns
)
select
@columns_updated_count = count(*)
from cte_bitmasks as c
where
convert(varbinary(1), substring(@columns_updated_mask, c.byte_number, 1)) & c.bit_mask > 0
-- actual check
if exists (select * from inserted)
if exists (select * from deleted)
select @operation = 'U'
else
select @operation = 'I'
else if exists (select * from deleted)
select @operation = 'D'
else if @columns_updated_count = @columns_count
select @operation = 'I'
else if @columns_updated_count > 0
select @operation = 'U'
else
select @operation = 'D'
사용도 가능합니다.columns_updated() & power(2, column_id - 1) > 0
열이 업데이트되었는지 확인하지만 열 수가 많은 테이블에는 안전하지 않습니다.조금 복잡한 계산 방법을 사용했습니다(아래의 유용한 기사 참조).
또, 이 어프로치에서는, 일부의 갱신이 인서트로서 잘못 분류되어(테이블내의 각 열이 업데이트의 영향을 받는 경우), 디폴트치만이 삽입되어 있는 경우는 삭제로서 분류될 가능성이 있습니다만, 이러한 인서트는(최소한의 시스템에서는) 희귀한 조작의 왕입니다.그것 말고는, 이 솔루션을 어떻게 개선해야 할지 현재로서는 모르겠습니다.
declare @result as smallint
declare @delete as smallint = 2
declare @insert as smallint = 4
declare @update as smallint = 6
SELECT @result = POWER(2*(SELECT count(*) from deleted),1) + POWER(2*(SELECT
count(*) from inserted),2)
if (@result & @update = @update)
BEGIN
print 'update'
SET @result=0
END
if (@result & @delete = @delete)
print 'delete'
if (@result & @insert = @insert)
print 'insert'
이렇게 하겠습니다.
select isnull((select top 1 1 from inserted t1),0) + isnull((select top 1 2 from deleted t1),0)
1 -> 삽입
2 -> 삭제
3 -> 갱신
set @i = isnull((select top 1 1 from inserted t1),0) + isnull((select top 1 2 from deleted t1),0)
--select @i
declare @action varchar(1) = case @i when 1 then 'I' when 2 then 'D' when 3 then 'U' end
--select @action
select @action c1,* from inserted t1 where @i in (1,3) union all
select @action c1,* from deleted t1 where @i in (2)
언급URL : https://stackoverflow.com/questions/741414/insert-update-trigger-how-to-determine-if-insert-or-update
'programing' 카테고리의 다른 글
SQL Server에서 INSERT IN으로 데이터 내보내기 (0) | 2023.04.07 |
---|---|
커서를 사용하지 않는 각 행의 SQL Call Stored Proced Procedure (0) | 2023.04.07 |
SQL Server Profiler에서 "exec sp_reset_connection"은 무엇을 의미합니까? (0) | 2023.04.07 |
Microsoft SQL Server 로그인 오류: 18456 (0) | 2023.04.07 |
백업을 복원할 때 모든 활성 연결을 끊으려면 어떻게 해야 합니까? (0) | 2023.04.07 |