

 Amazon Redshift는 패치 198부터 새 Python UDF 생성을 더 이상 지원하지 않습니다. 기존 Python UDF는 2026년 6월 30일까지 계속 작동합니다. 자세한 내용은 [블로그 게시물](https://aws.amazon.com/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/)을 참조하세요.

# 데이터베이스 간 쿼리 예제
<a name="cross-database_example"></a>

이 주제에는 데이터베이스 간 쿼리 사용 방법에 관한 예제가 포함되어 있습니다. 데이터베이스 간 쿼리는 단일 Amazon Redshift 클러스터 내의 여러 데이터베이스에서 작동하는 쿼리입니다.

다음 예를 사용하여 Amazon Redshift 데이터베이스를 참조하는 데이터베이스 간 쿼리를 설정하는 방법에 대해 알아봅니다.

시작하려면 Amazon Redshift 클러스터에서 데이터베이스 `db1` 및 `db2`와 사용자 `user1` 및 `user2`를 생성합니다. 자세한 내용은 [데이터베이스 생성](r_CREATE_DATABASE.md) 및 [CREATE USER](r_CREATE_USER.md) 섹션을 참조하세요.

```
--As user1 on db1
CREATE DATABASE db1;

CREATE DATABASE db2;

CREATE USER user1 PASSWORD 'Redshift01';

CREATE USER user2 PASSWORD 'Redshift01';
```

`db1`의 `user1`과 같이 테이블을 생성하고 `user2`에게 액세스 권한을 부여하고 `table1`에 값을 삽입합니다. 자세한 내용은 [GRANT](r_GRANT.md) 및 [INSERT](r_INSERT_30.md) 섹션을 참조하세요.

```
--As user1 on db1
CREATE TABLE table1 (c1 int, c2 int, c3 int);

GRANT SELECT ON table1 TO user2;

INSERT INTO table1 VALUES (1,2,3),(4,5,6),(7,8,9);
```

`db2`의 `user2`와 같이 세 부분으로 구성된 표기법을 사용하여 `db2`에서 데이터베이스 간 쿼리를 실행합니다.

```
--As user2 on db2
SELECT * from db1.public.table1 ORDER BY c1;

c1 | c2  | c3
---+-----+----
1  |  2  | 3
4  |  5  | 6
7  |  8  | 9
(3 rows)
```

이제 `user2`에 쓰기 권한을 부여하고 `db1`의 `table1`에 값을 `user2`로 삽입합니다.

```
--As user1 on db1
GRANT INSERT ON table1 TO user2;
```

`db2`의 `user2`와 같이 세 부분으로 구성된 표기법을 사용하여 `db2`에서 데이터베이스 간 쿼리를 실행함으로써 `db1`의 `table1`에 데이터를 삽입합니다.

```
--As user2 on db2
INSERT INTO db1.public.table1 VALUES (10,11,12);
SELECT * from db1.public.table1 ORDER BY c1;

c1  | c2   | c3
----+------+----
1   |  2   | 3
4   |  5   | 6
7   |  8   | 9
10  |  11  | 12
(4 rows)
```

`db2`의 `user2`와 같이 외부 스키마를 생성하고 외부 스키마 표기법을 사용하여 `db2`에서 데이터베이스 간 쿼리를 실행합니다.

```
--As user2 on db2
CREATE EXTERNAL SCHEMA db1_public_sch
FROM REDSHIFT DATABASE 'db1' SCHEMA 'public';

SELECT * FROM db1_public_sch.table1 ORDER BY c1;

c1  | c2 | c3
----+----+----
1   | 2  | 3
4   | 5  | 6
7   | 8  | 9
10  | 11 | 12
(4 rows)
```

다른 뷰를 생성하고 해당 뷰에 권한을 부여하려면 `db1`의 `user1`과 같이 다음을 수행합니다.

```
--As user1 on db1
CREATE VIEW regular_view AS SELECT c1 FROM table1;

GRANT SELECT ON regular_view TO user2;


CREATE MATERIALIZED VIEW mat_view AS SELECT c2 FROM table1;

GRANT SELECT ON mat_view TO user2;


CREATE VIEW late_bind_view AS SELECT c3 FROM public.table1 WITH NO SCHEMA BINDING;

GRANT SELECT ON late_bind_view TO user2;
```

`db2`의 `user2`와 같이 세 부분으로 구성된 표기법으로 다음 데이터베이스 간 쿼리를 실행하여 특정 뷰를 봅니다.

```
--As user2 on db2
SELECT * FROM db1.public.regular_view;

c1
----
1
4
7
10
(4 rows)

SELECT * FROM db1.public.mat_view;

c2
----
2
5
8
11
(4 rows)

SELECT * FROM db1.public.late_bind_view;

c3
----
3
6 
9
12
(4 rows)
```

`db2`의 `user2`와 같이 외부 스키마 표기법으로 다음 데이터베이스 간 쿼리를 실행하여 후기 바인딩 뷰를 쿼리합니다.

```
--As user2 on db2
SELECT * FROM db1_public_sch.late_bind_view;

c3
----
3
6
9
12
(4 rows)
```

`db2`의 `user2`와 같이 단일 쿼리에서 연결된 테이블을 사용하여 다음 명령을 실행합니다.

```
--As user2 on db2
CREATE TABLE table1 (a int, b int, c int);

INSERT INTO table1 VALUES (1,2,3), (4,5,6), (7,8,9);

SELECT a AS col_1, (db1.public.table1.c2 + b) AS sum_col2, (db1.public.table1.c3 + c) AS sum_col3 FROM db1.public.table1, table1 WHERE db1.public.table1.c1 = a;
col_1 | sum_col2 | sum_col3
------+----------+----------
1     | 4        | 6
4     | 10       | 12
7     | 16       | 18
(3 rows)
```

다음 예에서는 클러스터에 있는 모든 데이터베이스를 나열합니다.

```
select database_name, database_owner, database_type 
from svv_redshift_databases 
where database_name in ('db1', 'db2');

 database_name | database_owner | database_type 
---------------+----------------+---------------
 db1           |            100 | local
 db2           |            100 | local
(2 rows)
```

다음 예에서는 클러스터에 있는 모든 데이터베이스의 모든 Amazon Redshift 스키마를 나열합니다.

```
select database_name, schema_name, schema_owner, schema_type 
from svv_redshift_schemas 
where database_name in ('db1', 'db2');

 database_name |    schema_name     | schema_owner | schema_type 
---------------+--------------------+--------------+-------------
 db1           | pg_catalog         |            1 | local
 db1           | public             |            1 | local
 db1           | information_schema |            1 | local
 db2           | pg_catalog         |            1 | local
 db2           | public             |            1 | local
 db2           | information_schema |            1 | local
(6 rows)
```

다음 예에서는 클러스터에 있는 모든 데이터베이스의 모든 Amazon Redshift 테이블 또는 뷰를 나열합니다.

```
select database_name, schema_name, table_name, table_type 
from svv_redshift_tables 
where database_name in ('db1', 'db2') and schema_name in ('public');

 database_name | schema_name |     table_name      | table_type 
---------------+-------------+---------------------+------------
 db1           | public      | late_bind_view      | VIEW
 db1           | public      | mat_view            | VIEW
 db1           | public      | mv_tbl__mat_view__0 | TABLE
 db1           | public      | regular_view        | VIEW
 db1           | public      | table1              | TABLE
 db2           | public      | table2              | TABLE
(6 rows)
```

다음 예에서는 클러스터에 있는 모든 데이터베이스의 모든 Amazon Redshift 및 외부 스키마를 나열합니다.

```
select database_name, schema_name, schema_owner, schema_type 
from svv_all_schemas where database_name in ('db1', 'db2') ;

 database_name |    schema_name     | schema_owner | schema_type 
---------------+--------------------+--------------+-------------
 db1           | pg_catalog         |            1 | local
 db1           | public             |            1 | local
 db1           | information_schema |            1 | local
 db2           | pg_catalog         |            1 | local
 db2           | public             |            1 | local
 db2           | information_schema |            1 | local
 db2           | db1_public_sch     |            1 | external
(7 rows)
```

다음 예에서는 클러스터에 있는 모든 데이터베이스의 모든 Amazon Redshift 및 외부 테이블을 나열합니다.

```
select database_name, schema_name, table_name, table_type 
from svv_all_tables 
where database_name in ('db1', 'db2') and schema_name in ('public');

 database_name | schema_name |     table_name      | table_type 
---------------+-------------+---------------------+------------
 db1           | public      | regular_view        | VIEW
 db1           | public      | mv_tbl__mat_view__0 | TABLE
 db1           | public      | mat_view            | VIEW
 db1           | public      | late_bind_view      | VIEW
 db1           | public      | table1              | TABLE
 db2           | public      | table2              | TABLE
(6 rows)
```