DDL 트리거에서 사용하기 위해 EVENTDATA의 특정 부분을 구분 하시겠습니까?

느리게 걷는 사람

현재 트리거는 다음과 같습니다.

CREATE TRIGGER TestTrigger
ON DATABASE
FOR ALTER_TABLE
AS
BEGIN
SET NOCOUNT ON;
    DECLARE @FULL_STATEMENT SYSNAME
    SELECT @FULL_STATEMENT = EVENTDATA().value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]','nvarchar(max)')
    print('The following SQL statement was executed:')
    print('')
    print (@FULL_STATEMENT)
    print('')
    print('Next step is to work out how to single out the added column name')
    ROLLBACK
END

그런 다음 다음 SQL 문을 실행합니다.

USE [a_Database]
ALTER TABLE dbo.TABLE
ADD TestColumn varchar(50)

그리고 다음을 출력합니다.

다음 SQL 문이 실행되었습니다.

ALTER TABLE dbo.TABLE

TestColumn varchar (50) 추가

다음 단계는 추가 된 열 이름을 구분하는 방법을 찾는 것입니다.

메시지 3609, 수준 16, 상태 2, 줄 2

트랜잭션이 트리거에서 종료되었습니다. 배치가 중단되었습니다.

최종 목표는 "TestColumn"을 골라내어 내부 프로그램을 손상시킬 수있는 특정 문자를 포함하지 않도록하는 것입니다. 예를 들어 "TestColumn"은 유효한 이름이지만 "Test.Column"은 그렇지 않습니다.

원치 않는 문자를 확인하기 위해 골라 내고 새 변수 ( "@ColumnName"?)에 전달하는 가장 좋은 방법은 무엇입니까?

GarethD

alter 문은 둘 이상의 열을 추가 할 수 있다는 점을 명심해야합니다. alter column 문에 대해 생성 된 XML을 보면 더 나은 아이디어를 얻을 수 있습니다.

ALTER TABLE dbo.EventTest ADD NewColumn1 INT, NewColumn2 INT;

----------------------------
<EVENT_INSTANCE>
  <EventType>ALTER_TABLE</EventType>
  <PostTime>2015-06-30T14:28:30.790</PostTime>
  <SPID>67</SPID>
  <ServerName>XXXXXX</ServerName>
  <LoginName>XXXXXX</LoginName>
  <UserName>dbo</UserName>
  <DatabaseName>XXXXXX</DatabaseName>
  <SchemaName>dbo</SchemaName>
  <ObjectName>EventTest</ObjectName>
  <ObjectType>TABLE</ObjectType>
  <AlterTableActionList>
    <Create>
      <Columns>
        <Name>NewColumn1</Name>
        <Name>NewColumn2</Name>
      </Columns>
    </Create>
  </AlterTableActionList>
  <TSQLCommand>
    <SetOptions ANSI_NULLS="ON" ANSI_NULL_DEFAULT="ON" ANSI_PADDING="ON" QUOTED_IDENTIFIER="ON" ENCRYPTED="FALSE" />
    <CommandText>ALTER TABLE dbo.EventTest ADD NewColumn1 INT, NewColumn1 INT;</CommandText>
  </TSQLCommand>
</EVENT_INSTANCE>

따라서 여러 열을 추가 할 수 있으므로 사용할 수있는 열 목록을 얻으려면 여러 열을 확인해야합니다.

SELECT  ColumnName = Cols.value('.', 'SYSNAME')
FROM    EVENTDATA().nodes('EVENT_INSTANCE/AlterTableActionList/Create/Columns') x (Cols);

그런 다음 EXISTS예약 된 이름 목록 등을 확인하고 원하지 않는 문자를 확인하는 데 사용할 수 있습니다.

IF EXISTS
(   SELECT  1
    FROM    (   SELECT  ColumnName = Cols.value('.', 'SYSNAME')
                FROM    EVENTDATA().nodes('EVENT_INSTANCE/AlterTableActionList/Create/Columns') x (Cols)
            ) AS t
    WHERE   PATINDEX('%[.@!-]%', t.ColumnName) > 0  -- USE PATTERN MATCH TO CHECK FOR UNWANTED CHARACTERS
    OR      EXISTS 
            (   SELECT  1
                FROM    dbo.ReservedColumnNames AS rc
                WHERE   rc.Name = t.ColumnName
            )
)
BEGIN
    RAISERROR(...)
    ROLLBACK;
END

고려해야 할 또 다른 사항은 sp_rename다른 이벤트를 발생시키는 것이며 아마도 이것을 추적하고 싶을 것입니다. 여기 XML은 다음과 같습니다.

<EVENT_INSTANCE>
  <EventType>RENAME</EventType>
    ....
  <SchemaName>dbo</SchemaName>
  <ObjectName>NewColumn</ObjectName>
  <ObjectType>COLUMN</ObjectType>
  <TargetObjectName>EventTest</TargetObjectName>
  <TargetObjectType>TABLE</TargetObjectType>
  <NewObjectName>NewColumn2</NewObjectName>
  <Parameters>
    <Param>dbo.EventTest.NewColumn</Param>
    <Param>NewColumn2</Param>
    <Param>COLUMN</Param>
  </Parameters>
  <TSQLCommand>
    <SetOptions ANSI_NULLS="ON" ANSI_NULL_DEFAULT="ON" ANSI_PADDING="ON" QUOTED_IDENTIFIER="ON" ENCRYPTED="FALSE" />
    <CommandText>EXECUTE SP_RENAME 'dbo.EventTest.NewColumn', 'NewColumn2', 'COLUMN';</CommandText>
  </TSQLCommand>
</EVENT_INSTANCE>

따라서 여기서는 한 번에 하나의 열만 될 수 있으므로 약간 다르게 추적해야합니다. 노드에 대해 걱정할 필요가 없습니다.

SELECT  EVENTDATA().value('EVENT_INSTANCE[1]/NewObjectName[1]', 'SYSNAME')
WHERE   EVENTDATA().value('EVENT_INSTANCE[1]/EventType[1]', 'VARCHAR(13)') = 'RENAME'
AND     EVENTDATA().value('EVENT_INSTANCE[1]/ObjectType[1]', 'VARCHAR(13)') = 'COLUMN';

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

Ubuntu 14.04 LTS에서 외부 HD를 마운트 해제 / 분리하기 위해 사용자 정의 키보드 단축키를 설정 하시겠습니까?

분류에서Dev

그룹을 구분하기 위해 비트 유형의 열을 사용 하시겠습니까?

분류에서Dev

Javascript를 사용하여 pdf에서 텍스트의 특정 부분을 추출 하시겠습니까?

분류에서Dev

pandas를 사용하여 핵심 문구 뒤에 문자열의 특정 부분을 추출 하시겠습니까?

분류에서Dev

누구든지 Java의 특정 JSON 데이터 개체에 대한 백분율을 계산하는 방법을 제안 해 주시겠습니까?

분류에서Dev

문자열의 특정 부분을 교체 하시겠습니까?

분류에서Dev

테스트의 "Arrange"및 "Act"부분 모두에서 사용하기 위해 Arg.Is <> 정의를 캐시하는 방법이 있습니까?

분류에서Dev

파이썬에서 정규식을 사용하여 "----"로 구분 된 텍스트의 특수 부분을 어떻게 추출 할 수 있습니까?

분류에서Dev

특정 디렉토리 트리의 파일에 대해서만 vim 옵션을 설정 하시겠습니까?

분류에서Dev

유닉스 쉘 스크립트 / Python을 사용하여 특정 값을 찾기 위해 json 종류의 파일을 구문 분석

분류에서Dev

Python을 사용하여 JSON의 특정 부분에서 값 찾기

분류에서Dev

bash에서 cut을 사용하여 문자열의 특정 부분 자르기

분류에서Dev

lxml.html을 사용하여 웹 사이트의 특정 부분에서 텍스트 가져 오기 시도

분류에서Dev

시간 계산에 사용하기 위해 셀을 분으로 포맷 하시겠습니까?

분류에서Dev

구분자로 사용하기 위해 Android의 SQLite Cursor에 행을 추가하는 방법이 있습니까?

분류에서Dev

우분투 19.04에서 표시하기 위해 부분 크기 조정 사용

분류에서Dev

목록에서 선택 메뉴에 표시하기 위해 iOS 단축키의 사전에서 특정 값을 추출 하시겠습니까?

분류에서Dev

데이터 프레임의 특정 행에 대해 각 열의 구분 기호를 사용하여 각 값을 분할하는 방법

분류에서Dev

프로그램의 특정 부분을 반복하기 위해 do while 루프를 사용하려고하는데 제대로 실행되지 않습니다.

분류에서Dev

pyparsing의 Group ()은 구문 분석되는 언어에 특정한 구조를 생성하기 위해 사후 처리 단계가 필요합니까?

분류에서Dev

다른 웹 사이트의 특정 부분을 사용하여 내 자신에게 구현

분류에서Dev

범위에서 특정 열을 지정 하시겠습니까?

분류에서Dev

ANTLR에서 특정 하위 수준 규칙에 대해 스트림을 어떻게 구문 분석합니까?

분류에서Dev

구분 기호에서 stdout을 분할하고 무작위로 줄을 선택 하시겠습니까?

분류에서Dev

Google 시트에서 특정 텍스트 기준과 일치하는 값 열의 백분율 평균을 계산 하시겠습니까?

분류에서Dev

별도의 구분 기호로 문자열을 목록으로 분할하지만 해당 구분 기호의 특정 인스턴스에 의해서만

분류에서Dev

임베디드 C 코드에서 코드 분석 도구를 사용하기 위해 short long 재정의

분류에서Dev

모바일 앱에서 사용하기 위해 정적 맵을 서버 측에 캐시 하시겠습니까?

분류에서Dev

recyclerview 내부의 특정 위치에 구분 기호를 추가하는 방법은 무엇입니까?

Related 관련 기사

  1. 1

    Ubuntu 14.04 LTS에서 외부 HD를 마운트 해제 / 분리하기 위해 사용자 정의 키보드 단축키를 설정 하시겠습니까?

  2. 2

    그룹을 구분하기 위해 비트 유형의 열을 사용 하시겠습니까?

  3. 3

    Javascript를 사용하여 pdf에서 텍스트의 특정 부분을 추출 하시겠습니까?

  4. 4

    pandas를 사용하여 핵심 문구 뒤에 문자열의 특정 부분을 추출 하시겠습니까?

  5. 5

    누구든지 Java의 특정 JSON 데이터 개체에 대한 백분율을 계산하는 방법을 제안 해 주시겠습니까?

  6. 6

    문자열의 특정 부분을 교체 하시겠습니까?

  7. 7

    테스트의 "Arrange"및 "Act"부분 모두에서 사용하기 위해 Arg.Is <> 정의를 캐시하는 방법이 있습니까?

  8. 8

    파이썬에서 정규식을 사용하여 "----"로 구분 된 텍스트의 특수 부분을 어떻게 추출 할 수 있습니까?

  9. 9

    특정 디렉토리 트리의 파일에 대해서만 vim 옵션을 설정 하시겠습니까?

  10. 10

    유닉스 쉘 스크립트 / Python을 사용하여 특정 값을 찾기 위해 json 종류의 파일을 구문 분석

  11. 11

    Python을 사용하여 JSON의 특정 부분에서 값 찾기

  12. 12

    bash에서 cut을 사용하여 문자열의 특정 부분 자르기

  13. 13

    lxml.html을 사용하여 웹 사이트의 특정 부분에서 텍스트 가져 오기 시도

  14. 14

    시간 계산에 사용하기 위해 셀을 분으로 포맷 하시겠습니까?

  15. 15

    구분자로 사용하기 위해 Android의 SQLite Cursor에 행을 추가하는 방법이 있습니까?

  16. 16

    우분투 19.04에서 표시하기 위해 부분 크기 조정 사용

  17. 17

    목록에서 선택 메뉴에 표시하기 위해 iOS 단축키의 사전에서 특정 값을 추출 하시겠습니까?

  18. 18

    데이터 프레임의 특정 행에 대해 각 열의 구분 기호를 사용하여 각 값을 분할하는 방법

  19. 19

    프로그램의 특정 부분을 반복하기 위해 do while 루프를 사용하려고하는데 제대로 실행되지 않습니다.

  20. 20

    pyparsing의 Group ()은 구문 분석되는 언어에 특정한 구조를 생성하기 위해 사후 처리 단계가 필요합니까?

  21. 21

    다른 웹 사이트의 특정 부분을 사용하여 내 자신에게 구현

  22. 22

    범위에서 특정 열을 지정 하시겠습니까?

  23. 23

    ANTLR에서 특정 하위 수준 규칙에 대해 스트림을 어떻게 구문 분석합니까?

  24. 24

    구분 기호에서 stdout을 분할하고 무작위로 줄을 선택 하시겠습니까?

  25. 25

    Google 시트에서 특정 텍스트 기준과 일치하는 값 열의 백분율 평균을 계산 하시겠습니까?

  26. 26

    별도의 구분 기호로 문자열을 목록으로 분할하지만 해당 구분 기호의 특정 인스턴스에 의해서만

  27. 27

    임베디드 C 코드에서 코드 분석 도구를 사용하기 위해 short long 재정의

  28. 28

    모바일 앱에서 사용하기 위해 정적 맵을 서버 측에 캐시 하시겠습니까?

  29. 29

    recyclerview 내부의 특정 위치에 구분 기호를 추가하는 방법은 무엇입니까?

뜨겁다태그

보관