다음을 통해 공유


교차 클라스터 및 교차 데이터베이스 쿼리

적용 대상: ✅Microsoft Fabric✅Azure Data ExplorerAzure MonitorMicrosoft Sentinel

쿼리는 컨텍스트에서 데이터베이스로 지정된 특정 데이터베이스를 사용하여 실행됩니다. 이 데이터베이스는 권한 검사의 기본값으로 사용됩니다. 클러스터 또는 데이터베이스를 지정하지 않고 쿼리에서 엔터티를 참조하는 경우 이 데이터베이스에 대해 확인됩니다.

쿼리는 컨텍스트에서 데이터베이스로 지정된 특정 데이터베이스를 사용하여 실행됩니다. 이 데이터베이스는 권한 검사의 기본값으로 사용됩니다. 컨텍스트를 지정하지 않고 쿼리에서 엔터티를 참조하는 경우 이 데이터베이스에 대해 확인됩니다.

이 문서에서는 현재 컨텍스트 데이터베이스 외부에 있는 엔터티를 포함하는 쿼리를 실행하는 방법을 설명합니다.

필수 조건

  • 클러스터가 서로 다른 테넌트에 있는 경우 테넌트 간 쿼리 및 명령 허용의 지침을 따릅니다.

컨텍스트에서 클러스터 및 데이터베이스 식별

컨텍스트에서 이벤트 하우스 및 데이터베이스 식별

다음 표에서는 쿼리 환경별로 컨텍스트에서 데이터베이스를 식별하는 방법을 설명합니다.

Environment 컨텍스트의 데이터베이스
Kusto Explorer 기본 데이터베이스는 연결 패널에서 선택한 데이터베이스이며 현재 클러스터는 해당 데이터베이스를 포함하는 클러스터입니다.
Azure Data Explorer 웹 UI 기본 데이터베이스는 연결 창에서 선택한 데이터베이스이고, 현재 클러스터는 해당 데이터베이스를 포함하는 클러스터입니다.
클라이언트 라이브러리 Kusto 연결 문자열 및 속성별로 Data Source 기본 데이터베이스 및 Initial Catalog 클러스터를 지정합니다.
Environment 컨텍스트의 데이터베이스/Eventhouse
Kusto Explorer 기본 데이터베이스는 연결 패널에서 선택한 데이터베이스이며 현재 Eventhouse는 해당 데이터베이스를 포함하는 이벤트 하우스입니다.
실시간 인텔리전스 KQL 쿼리 세트 기본 데이터베이스는 직접 또는 이벤트 하우스를 통해 선택된 현재 데이터베이스입니다.
클라이언트 라이브러리 Kusto 연결 문자열 속성에 Data Source 사용되는 데이터베이스 URI사용하여 기본 데이터베이스를 지정합니다. eventhouse의 경우 해당 클러스터 URI를 사용합니다. 선택한 이벤트 하우스에 대한 Eventhouse 세부 정보 섹션에서 시스템 개요를 선택하여 찾을 수 있습니다.

클러스터 간 또는 데이터베이스 간 쿼리 수행

크로스 이벤트 하우스 또는 데이터베이스 간 쿼리 수행

컨텍스트에서 데이터베이스 외부의 엔터티에 액세스하려면 cluster()database() 함수를 사용하여 엔터티 이름을 한정합니다.

동일한 클러스터 내의 다른 데이터베이스에 있는 테이블의 경우:

database("<DatabaseName>").<TableName>

원격 클러스터의 테이블:

cluster("<ClusterName>").database("<DatabaseName>").<TableName>

동일한 Eventhouse 내의 다른 데이터베이스에 있는 테이블의 경우:

database("<DatabaseName>").<TableName>

원격 이벤트 하우스 또는 원격 서비스(예: Azure Data Explorer) 클러스터의 테이블:

cluster("<EventhouseClusterURI>").database("<DatabaseName>").<TableName>

참고 항목

쿼리를 실행하려면 기본 데이터베이스 및 쿼리에서 참조되는 다른 모든 데이터베이스에 대한 뷰어 권한이 있어야 합니다. 자세한 내용은 Kusto 역할 기반 액세스 제어를 참조하세요.

연산자를 특별히 사용하지 take 않더라도 쿼리에서 반환되는 레코드 수는 기본적으로 제한됩니다. 이 제한을 해제하려면 클라이언트 요청 옵션을 사용합니다 notruncation . 자세한 내용은 쿼리 제한을 참조하세요.

정규화된 이름 및 공용 구조체 연산자

정규화된 이름이 공용 구조체 연산자의 피연산자로 표시되면 와일드카드를 사용하여 여러 테이블과 여러 데이터베이스를 지정할 수 있습니다. 와일드카드는 클러스터 이름에 허용되지 않습니다.

union withsource=TableName *, database("OtherDb*").*Table, cluster("OtherCluster").database("*").*

정규화된 이름이 공용 구조체 연산자의 피연산자로 표시되면 와일드카드를 사용하여 여러 테이블과 여러 데이터베이스를 지정할 수 있습니다. 와일드카드는 이벤트하우스 이름에 허용되지 않습니다.

union withsource=TableName *, database("OtherDb*").*Table, cluster("OtherEventhouseClusterURI").database("*").*

참고 항목

기본 데이터베이스의 이름도 잠재적 일치 항목이므로 database("*") 기본값을 포함한 모든 데이터베이스의 모든 테이블을 지정합니다.

정규화된 이름 및 액세스 문 제한

정규화된 이름 또는 패턴은 제한 액세스 문에도 포함될 수 있습니다. 클러스터 이름의 와일드카드는 허용되지 않습니다.

이벤트 하우스 이름의 와일드카드는 허용되지 않습니다.

다음 쿼리는 다음 엔터티에 대한 쿼리 액세스를 제한합니다.

  • 기본 데이터베이스에서 my...시작하는 엔터티 이름입니다.
  • 현재 클러스터의 MyOther라는 모든 데이터베이스에 있는 모든 테이블입니다.
  • 클러스터에서 my2라는 모든 데이터베이스의 모든 테이블이 OtherCluster.kusto.windows.net.
restrict access to (my*, database("MyOther*").*, cluster("OtherCluster").database("my2*").*);
  • 기본 데이터베이스에서 이벤트시작하는 엔터티 이름입니다.
  • 현재 Eventhouse의 EventOther라는 모든 데이터베이스에 있는 모든 테이블입니다.
  • eventhouse에서 event2라는 모든 데이터베이스의 모든 테이블이 OtherEventhouse.kusto.data.microsoft.com.
restrict access to (event*, database("EventOther*").*, cluster("OtherEventhouseClusterURI").database("event2*").*);

원격 엔터티의 스키마 변경 처리

클러스터 간 쿼리를 처리하려면 초기 쿼리 해석을 수행하는 클러스터에 원격 클러스터에서 참조되는 엔터티의 스키마가 있어야 합니다. 이 정보를 얻기 위해 스키마를 검색하는 명령이 전송된 다음 캐시에 저장됩니다.

원격 클러스터에 스키마가 변경되면 캐시된 스키마가 오래되었을 수 있습니다. 이로 인해 새 열이나 삭제된 열이 발생하는 시나리오를 포함하여 원치 않는 효과가 발생할 수 있습니다 Partial query failure. 이러한 문제를 해결하려면 .clear 캐시 원격 스키마 명령을 사용하여 스키마수동으로 새로 고칩니다.

이벤트 하우스 간 또는 eventhouse-to-ADX 클러스터 쿼리를 처리하려면 초기 쿼리 해석을 수행하는 Eventhouse에 원격 이벤트 하우스 또는 클러스터에서 참조되는 엔터티의 스키마가 있어야 합니다. 이 정보를 얻기 위해 스키마를 검색하는 명령이 전송된 다음 캐시에 저장됩니다.

원격 스키마 변경이 있는 경우 캐시된 스키마가 오래되었을 수 있습니다. 이로 인해 새 열이나 삭제된 열이 발생하는 시나리오를 포함하여 원치 않는 효과가 발생할 수 있습니다 Partial query failure. 이러한 문제를 해결하려면 .clear 캐시 원격 스키마 명령을 사용하여 스키마수동으로 새로 고칩니다.

함수 및 뷰

함수 및 뷰(영구 및 생성된 인라인)는 데이터베이스 및 클러스터 경계에서 테이블을 참조할 수 있습니다. 다음 코드는 유효합니다.

let MyView = Table1 join database("OtherDb").Table2 on Key | join cluster("OtherCluster").database("SomeDb").Table3 on Key;
MyView | where ...

영구 함수 및 뷰는 동일한 클러스터의 다른 데이터베이스에서 액세스할 수 있습니다.

예를 들어 데이터베이스 OtherDb에서 다음 테이블 형식 함수(보기)를 만드는 경우를 예로 들 수 있습니다.

.create function MyView(v:string) { Table1 | where Column1 has v ...  }  

그런 다음 데이터베이스 OtherDb에 다음 스칼라 함수를 만듭니다.

.create function MyCalc(a:double, b:double, c:double) { (a + b) / c }  

기본 데이터베이스에서 이러한 엔터티는 다음과 같이 참조할 수 있습니다.

database("OtherDb").MyView("exception") | extend CalCol=database("OtherDb").MyCalc(Col1, Col2, Col3) | take 10

함수 및 뷰(영구 및 생성된 인라인)는 데이터베이스 및 Eventhouse 경계에서 테이블을 참조할 수 있습니다. 다음 코드는 유효합니다.

let EventView = Table1 join database("OtherDb").Table2 on Key | join cluster("OtherEventhouseClusterURI").database("SomeDb").Table3 on Key;
EventView | where ...

영구 함수 및 뷰는 동일한 이벤트 하우스의 다른 데이터베이스에서 액세스할 수 있습니다.

예를 들어 데이터베이스 OtherDb에서 다음 테이블 형식 함수(보기)를 만드는 경우를 예로 들 수 있습니다.

.create function EventView(v:string) { Table1 | where Column1 has v ...  }  

그런 다음 데이터베이스 OtherDb에 다음 스칼라 함수를 만듭니다.

.create function EventCalc(a:double, b:double, c:double) { (a + b) / c }  

예를 들어 데이터베이스 OtherDb에서 다음 테이블 형식 함수(보기)를 만드는 경우를 예로 들 수 있습니다.

.create function EventView(v:string) { Table1 | where Column1 has v ...  }  

그런 다음 데이터베이스 OtherDb에 다음 스칼라 함수를 만듭니다.

.create function EventCalc(a:double, b:double, c:double) { (a + b) / c }  

기본 데이터베이스에서 이러한 엔터티는 다음과 같이 참조할 수 있습니다.

database("OtherDb").EventView("exception") | extend CalCol=database("OtherDb").EventCalc(Col1, Col2, Col3) | take 10

클러스터 간 함수 호출의 제한 사항

테이블 형식 함수 또는 뷰는 클러스터에서 참조할 수 있습니다. 다음과 같은 제한 사항이 적용됩니다.

  • 원격 함수는 테이블 형식 스키마를 반환해야 합니다. 스칼라 함수는 동일한 클러스터에서만 액세스할 수 있습니다.
  • 원격 함수는 스칼라 인수만 수락할 수 있습니다. 하나 이상의 테이블 인수를 가져오는 함수는 동일한 클러스터에서만 액세스할 수 있습니다.
  • 원격 함수의 결과 스키마는 수정되어야 합니다(쿼리의 일부를 실행하지 않고 미리 알려 됨). 따라서 플러그 인과 같은 pivot 쿼리 구문을 사용할 수 없습니다. 플러그 인과 같은 bag_unpack 일부 플러그 인은 결과 스키마를 정적으로 나타내는 방법을 지원하며 이 형식 으로 클러스터 간 함수 호출에 사용할 수 있습니다 .
  • 성능상의 이유로 호출 클러스터는 초기 호출 후 원격 엔터티의 스키마를 캐시합니다. 따라서 원격 엔터티를 변경하면 캐시된 스키마 정보와 일치하지 않아 쿼리 오류가 발생할 수 있습니다. 자세한 내용은 클러스터 간 쿼리 및 스키마 변경 내용을 참조하세요.

이벤트 하우스 간 함수 호출의 제한 사항

테이블 형식 함수 또는 뷰는 이벤트 하우스에서 참조할 수 있습니다. 다음과 같은 제한 사항이 적용됩니다.

  • 원격 함수는 테이블 형식 스키마를 반환해야 합니다. 스칼라 함수는 동일한 이벤트 하우스에서만 액세스할 수 있습니다.
  • 원격 함수는 스칼라 인수만 수락할 수 있습니다. 하나 이상의 테이블 인수를 가져오는 함수는 동일한 이벤트 하우스에서만 액세스할 수 있습니다.
  • 원격 함수의 결과 스키마는 수정되어야 합니다(쿼리의 일부를 실행하지 않고 미리 알려 됨). 따라서 플러그 인과 같은 pivot 쿼리 구문을 사용할 수 없습니다. 플러그 인과 같은 bag_unpack 일부 플러그 인은 결과 스키마를 정적으로 나타내는 방법을 지원하며 이 형식 으로 이벤트 하우스 간 함수 호출에 사용할 수 있습니다 .
  • 성능상의 이유로 호출 이벤트 하우스는 초기 호출 후 원격 엔터티의 스키마를 캐시합니다. 따라서 원격 엔터티를 변경하면 캐시된 스키마 정보와 일치하지 않아 쿼리 오류가 발생할 수 있습니다. 자세한 내용은 클러스터 간 쿼리 및 스키마 변경 내용을 참조하세요.

예제

다음 클러스터 간 호출은 유효합니다.

cluster("OtherCluster").database("SomeDb").MyView("exception") | count

다음 쿼리는 원격 스칼라 함수 MyCalc를 호출합니다. 이 호출은 규칙 #1을 위반하므로 유효하지 않습니다.

MyTable | extend CalCol=cluster("OtherCluster").database("OtherDb").MyCalc(Col1, Col2, Col3) | take 10

다음 쿼리는 원격 함수 MyCalc 를 호출하고 테이블 형식 매개 변수를 제공합니다. 이 호출은 규칙 #2를 위반하므로 유효하지 않습니다.

cluster("OtherCluster").database("OtherDb").MyCalc(datatable(x:string, y:string)["x","y"] )

다음 이벤트 하우스 간 호출이 유효합니다.

cluster("OtherEventhouseURI").database("SomeDb").EventView("exception") | count

다음 쿼리는 원격 스칼라 함수 EventCalc를 호출합니다. 이 호출은 규칙 #1을 위반하므로 유효하지 않습니다.

Eventtable | extend CalCol=cluster("OtherEventhouseClusterURI").database("OtherDb").MyCalc(Col1, Col2, Col3) | take 10

다음 쿼리는 원격 함수 EventCalc 를 호출하고 테이블 형식 매개 변수를 제공합니다. 이 호출은 규칙 #2를 위반하므로 유효하지 않습니다.

cluster("EventhouseClusterURI").database("OtherDb").MyCalc(datatable(x:string, y:string)["x","y"] )

다음 쿼리는 매개 변수tablename를 기반으로 하는 변수 스키마 출력이 있는 원격 함수 SomeTable 를 호출합니다. 이 호출은 규칙 #3을 위반하므로 유효하지 않습니다.

OtherDb테이블 형식 함수

.create function SomeTable(tablename:string) { table(tablename)  }  

기본 데이터베이스에 있습니다.

cluster("OtherCluster").database("OtherDb").SomeTable("MyTable")
cluster("OtherEventhouseClusterURI").database("OtherDb").SomeTable("EventTable")

다음 쿼리는 데이터(pivot() 플러그 인의 동적 출력을 기반으로 하는 변수 스키마 출력이 있는 원격 함수 GetDataPivot 를 호출합니다. 이 호출은 규칙 #3을 위반하므로 유효하지 않습니다.

OtherDb테이블 형식 함수

.create function GetDataPivot() { T | evaluate pivot(PivotColumn) }  

기본 데이터베이스의 테이블 형식 함수입니다.

cluster("OtherCluster").database("OtherDb").GetDataPivot()
cluster("OtherEventhouseClusterURI").database("OtherDb").GetDataPivot()