클러스터 간 및 데이터베이스 간 쿼리
쿼리는 컨텍스트에서 데이터베이스로 지정된 특정 데이터베이스와 함께 실행됩니다. 이 데이터베이스는 권한 검사의 기본값으로 사용됩니다. 클러스터 또는 데이터베이스를 지정하지 않고 쿼리에서 엔터티를 참조하는 경우 이 데이터베이스에 대해 확인됩니다.
이 문서에서는 현재 컨텍스트 데이터베이스 외부에 있는 엔터티를 포함하는 쿼리를 실행하는 방법을 설명합니다.
사전 요구 사항
- 클러스터가 다른 테넌트에 있는 경우 테넌트 간 쿼리 및 명령 허용의 지침을 따릅니다.
컨텍스트에서 클러스터 및 데이터베이스 식별
다음 표에서는 쿼리 환경별로 컨텍스트에서 데이터베이스를 식별하는 방법을 설명합니다.
Environment | 컨텍스트의 데이터베이스 |
---|---|
Kusto Explorer | 기본 데이터베이스는 연결 패널에서 선택한 데이터베이스이며 현재 클러스터는 해당 데이터베이스를 포함하는 클러스터입니다. |
Azure Data Explorer 웹 UI | 기본 데이터베이스는 연결 창에서 선택한 데이터베이스이며 현재 클러스터는 해당 데이터베이스를 포함하는 클러스터입니다. |
클라이언트 라이브러리 | 기본 데이터베이스 및 클러스터는 Kusto 연결 문자열의 및 Initial Catalog 속성에 의해 Data Source 지정됩니다. |
클러스터 간 또는 데이터베이스 간 쿼리 수행
컨텍스트에서 데이터베이스 외부의 엔터티에 액세스하려면 cluster() 및 database() 함수를 사용하여 엔터티 이름을 한정합니다.
동일한 클러스터 내의 다른 데이터베이스에 있는 테이블의 경우:
database("<DatabaseName>").<TableName>
원격 클러스터의 테이블:
cluster("<ClusterName>").database("<DatabaseName>").<TableName>
참고
쿼리를 실행하려면 기본 데이터베이스 및 쿼리에서 참조되는 다른 모든 데이터베이스에 대한 뷰어 권한이 있어야 합니다. 자세한 내용은 Kusto 역할 기반 액세스 제어를 참조하세요.
팁
연산자를 구체적으로 사용하지 take
않더라도 쿼리에서 반환되는 레코드 수는 기본적으로 제한됩니다. 이 제한을 올리려면 notruncation
클라이언트 요청 옵션을 사용합니다. 자세한 내용은 쿼리 제한을 참조하세요.
정규화된 이름 및 공용 구조체 연산자
정규화된 이름이공용 구조체 연산자의 피연산자로 표시되면 와일드카드를 사용하여 여러 테이블과 여러 데이터베이스를 지정할 수 있습니다. 와일드카드는 클러스터 이름에 허용되지 않습니다.
union withsource=TableName *, database("OtherDb*").*Table, cluster("OtherCluster").database("*").*
참고
기본 데이터베이스의 이름도 잠재적 일치 항목이므로 database("*")
기본값을 포함한 모든 데이터베이스의 모든 테이블을 지정합니다.
정규화된 이름 및 액세스 문 제한
정규화된 이름 또는 패턴을 restrict access 문에 포함할 수도 있습니다. 클러스터 이름의 와일드카드는 허용되지 않습니다.
다음 쿼리는 다음 엔터티에 대한 쿼리 액세스를 제한합니다.
- 기본 데이터베이스의 my... 로 시작하는 엔터티 이름입니다.
- 현재 클러스터의 MyOther... 라는 모든 데이터베이스에 있는 모든 테이블입니다.
- 클러스터의 my2... 라는 모든 데이터베이스에 있는 모든 테이블 은 OtherCluster.kusto.windows.net.
restrict access to (my*, database("MyOther*").*, cluster("OtherCluster").database("my2*").*);
원격 엔터티의 스키마 변경 처리
클러스터 간 쿼리를 처리하려면 초기 쿼리 해석을 수행하는 클러스터에 원격 클러스터에서 참조되는 엔터티의 스키마가 있어야 합니다. 이 정보를 가져오기 위해 스키마를 검색하기 위한 명령이 전송된 다음 캐시에 저장됩니다.
원격 클러스터에서 스키마가 변경될 경우 캐시된 스키마가 오래될 수 있습니다. 이로 인해 새 열 또는 삭제된 열이 를 발생시키는 시나리오를 포함하여 원치 않는 효과가 발생할 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
클러스터 간 함수 호출의 제한 사항
테이블 형식 함수 또는 뷰는 클러스터에서 참조할 수 있습니다. 다음과 같은 제한 사항이 적용됩니다.
- 원격 함수는 테이블 형식 스키마를 반환해야 합니다. 스칼라 함수는 동일한 클러스터에서만 액세스할 수 있습니다.
- 원격 함수는 스칼라 인수만 수락할 수 있습니다. 하나 이상의 테이블 인수를 가져오는 함수는 동일한 클러스터에서만 액세스할 수 있습니다.
- 원격 함수의 결과 스키마를 수정해야 합니다(쿼리의 일부를 실행하지 않고 미리 알려 줍니다).
이렇게 하면 플러그 인과 같은 쿼리 구문을 사용할 수 없습니다
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"] )
다음 쿼리는 매개 변수 tablename
를 기반으로 변수 스키마 출력이 있는 원격 함수 SomeTable
를 호출합니다.
이 호출은 규칙 #3을 위반하므로 유효하지 않습니다.
의 테이블 형식 함수입니다 OtherDb
.
.create function SomeTable(tablename:string) { table(tablename) }
기본 데이터베이스에서.
cluster("OtherCluster").database("OtherDb").SomeTable("MyTable")
다음 쿼리는 데이터(pivot() 플러그 인에 동적 출력이 있는) 기반의 변수 스키마 출력이 있는 원격 함수 GetDataPivot
를 호출합니다.
이 호출은 규칙 #3을 위반하므로 유효하지 않습니다.
의 테이블 형식 함수입니다 OtherDb
.
.create function GetDataPivot() { T | evaluate pivot(PivotColumn) }
기본 데이터베이스의 테이블 형식 함수입니다.
cluster("OtherCluster").database("OtherDb").GetDataPivot()
관련 콘텐츠
피드백
https://aka.ms/ContentUserFeedback
출시 예정: 2024년 내내 콘텐츠에 대한 피드백 메커니즘으로 GitHub 문제를 단계적으로 폐지하고 이를 새로운 피드백 시스템으로 바꿀 예정입니다. 자세한 내용은 다음을 참조하세요.다음에 대한 사용자 의견 제출 및 보기