SQL 표준은 부작용이있는 함수를 정의합니까?
예를 들어, 파일 에 쓰거나 *와 같은 일을 할 때 테이블의 특정 열에서 값을 업데이트하는 기능이 있습니까?
SELECT myfunction(params...);
나는 때때로 이것을 보았지만 SQL 표준이 동일한 지 궁금합니다.
* 이것은 특별히 PostgreSQL에 관한 질문이 아닙니다. PostgreSQL에서 볼 수있는 부작용 예제 만 사용하고 있습니다.
SQL 표준은 부작용이있는 함수를 정의합니까?
예를 들어, 파일 에 쓰거나 *와 같은 일을 할 때 테이블의 특정 열에서 값을 업데이트하는 기능이 있습니까?
SELECT myfunction(params...);
나는 때때로 이것을 보았지만 SQL 표준이 동일한 지 궁금합니다.
* 이것은 특별히 PostgreSQL에 관한 질문이 아닙니다. PostgreSQL에서 볼 수있는 부작용 예제 만 사용하고 있습니다.
답변:
여기 몇 가지 다른 질문이 있습니다.
Q : ANSI 표준 SQL 함수 란 무엇입니까?
ANSI 표준 기능은 AVG, COUNT, MIN, MAX와 같은 것입니다. 그것들은 1992 ANSI 표준 에 포함되어 있지만 건조하고 지루한 읽기 중 하나입니다.
Q : ANSI 표준 SQL 함수는 데이터베이스의 데이터를 변경합니까?
아니요. 데이터를 변경하는 데 사용할 수 있습니다. 예를 들어 다음과 같이 말할 수 있습니다.
INSERT INTO dbo.MyReport SELECT MAX(SalespersonRevenue) FROM dbo.Sales
그러나 AVG, COUNT, MIN, MAX 등을 사용한다고해서 데이터베이스 내부의 데이터가 영구적으로 변경되어서는 안됩니다.
Q : ANSI 표준으로 본인의 함수를 작성할 수 있습니까?
예, 그러나 정확한 구현은 공급 업체마다 다릅니다. 작성하는 함수는 ANSI 언어 표준을 준수 할 수 있지만, 함수 내부에서 수행하는 작업은 부작용을 만드는 것처럼 끔찍하게 끔찍할 수 있습니다.
Q : 데이터를 작성하는 자체 기능을 만들 수 있습니까?
당신이 창조적이라면 왜 그렇습니까? 저는 Microsoft SQL Server 사용자이므로 해당 플랫폼에 중점을 둘 것입니다. 온라인 설명서의 기능 페이지 는 다음과 같이 말합니다.
사용자 정의 함수는 데이터베이스 상태를 수정하는 조치를 수행하는 데 사용할 수 없습니다.
내가 말하는 것 :
넌 내 진짜 아빠가 아니야
규칙을 어기는 방법은 다음과 같습니다. 경고 : 매우 나쁜 아이디어가 따릅니다.
이러한 모든 예는 성능 및 트랜잭션 일관성의 형태로 큰 단점이 있습니다. 당신은 이론적으로 할 수 있는지 물었고 대답은 그렇습니다. 나는 내 자신의 코드 중 하나를 사용하지 않을 것입니다-물러서서 "여기서 달성하려는 비즈니스 목표는 무엇이며 성능 및 트랜잭션 일관성을 달성하기 위해 수행 할 수있는 방법이 있습니까? ? " 이에 대한 구체적인 조언을 원하면 구체적인 스택 질문을 부탁드립니다.
SQL Server와 관련하여 결정적으로 만 말할 수 있으며 모든 데이터베이스 구현에서 일관성이없는 것으로 보입니다. 그러나 SQL Server에서 함수는 부작용을 일으키지 않을 수 있습니다. 이것은 성공하지 못한 채 여러 번 우회하려고 시도한 어렵고 빠른 규칙입니다.
일반적인 의미에서 함수에 대해 생각할 경우 부작용 (예 : 저장 프로 시저)을 허용하지만 사용자 정의 함수는 허용하지 않는 SQL 모듈이 있습니다.
"영리한 솔루션은 확장 할 수 없습니다"라는 말이 있으며 특히 Microsoft 제품에 적용됩니다. MS가 실제 기능으로 추가했기 때문에 초기 버전에서는 더 이상 사용되지 않는 초기 버전의 SQL Server에서 많은 영리한 해결 방법을 보았습니다.
솔직히 기능이 된 적이없는 기능은 근본적으로 T-SQL 개발의 일부 측면을 위반했기 때문에 기능이되지 않았습니다. 기능의 부작용은 그중 하나입니다.