부작용이있는 표준 SQL 함수가 있습니까?


11

SQL 표준은 부작용이있는 함수를 정의합니까?

예를 들어, 파일쓰거나 *와 같은 일을 할 때 테이블의 특정 열에서 값을 업데이트하는 기능이 있습니까?

SELECT myfunction(params...);

나는 때때로 이것을 보았지만 SQL 표준이 동일한 지 궁금합니다.


* 이것은 특별히 PostgreSQL에 관한 질문이 아닙니다. PostgreSQL에서 볼 수있는 부작용 예제 만 사용하고 있습니다.


기능은 플랫폼마다 매우 다르지만, 예를 들어 이메일을 보내는 등의 표준 (예 : Oracle 제공) 애드온 기능이 있습니다. 그리고 NEWID 및 RAND와 같은 SQL Server에는 비 결정적 함수가 있으며 SQL Server의 함수는 확장 프로 시저를 호출 할 수도 있습니다.
Cade Roux

3
질문에 " SQL 표준 에 부작용 이 있는 함수가 포함되어 있습니까? "라는 대답은 "아니오"라고 생각합니다. 질문이 " SQL 표준이하는 허용 부작용을 작성하는 기능은 "그때는 대답은 '예라고 생각합니다.
a_horse_with_no_name 12

@a_horse_with_no_name 감사합니다. 내 질문은 스타일과 컨벤션에 관한 전자였다.
tinlyx

답변:


18

여기 몇 가지 다른 질문이 있습니다.

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 사용자이므로 해당 플랫폼에 중점을 둘 것입니다. 온라인 설명서의 기능 페이지 는 다음과 같이 말합니다.

사용자 정의 함수는 데이터베이스 상태를 수정하는 조치를 수행하는 데 사용할 수 없습니다.

내가 말하는 것 :

넌 내 진짜 아빠가 아니야

규칙을 어기는 방법은 다음과 같습니다. 경고 : 매우 나쁜 아이디어가 따릅니다.

  • 함수에서이 악의적 인 목적을 위해 특별히 만들어진 새 테이블을 쿼리 한 다음 select 문에 대한 테이블을 감시하고 작업 (확장 이벤트, 감사 또는 프로파일 러 추적)을 발생시키는 것을 만듭니다. Rube Goldberg 종류의 장치를 연결하여 해당 선택문을 기반으로 작업을 수행 할 수 있습니다.
  • 이 기능에서 CLR 코드를 호출하면 웹 서비스를 호출 할 수도 있습니다 . 이 웹 서비스는 데이터를 자신의 데이터베이스로 다시 푸시 할 수 있습니다.
  • 함수에서 xp_cmdshell을 호출 하고 명령 프롬프트를 통해 무언가를 수행하십시오. (댓글에서 HT @AaronBertrand)

이러한 모든 예는 성능 및 트랜잭션 일관성의 형태로 큰 단점이 있습니다. 당신은 이론적으로 할 수 있는지 물었고 대답은 그렇습니다. 나는 내 자신의 코드 중 하나를 사용하지 않을 것입니다-물러서서 "여기서 달성하려는 비즈니스 목표는 무엇이며 성능 및 트랜잭션 일관성을 달성하기 위해 수행 할 수있는 방법이 있습니까? ? " 이에 대한 구체적인 조언을 원하면 구체적인 스택 질문을 부탁드립니다.


감사. PSM은 SQL 표준이 그렇지 않은 경우 함수 나 프로 시저가 부작용을 갖도록 허용합니까?
Tim


-3

SQL Server와 관련하여 결정적으로 만 말할 수 있으며 모든 데이터베이스 구현에서 일관성이없는 것으로 보입니다. 그러나 SQL Server에서 함수는 부작용을 일으키지 않을 수 있습니다. 이것은 성공하지 못한 채 여러 번 우회하려고 시도한 어렵고 빠른 규칙입니다.

일반적인 의미에서 함수에 대해 생각할 경우 부작용 (예 : 저장 프로 시저)을 허용하지만 사용자 정의 함수는 허용하지 않는 SQL 모듈이 있습니다.

"영리한 솔루션은 확장 할 수 없습니다"라는 말이 있으며 특히 Microsoft 제품에 적용됩니다. MS가 실제 기능으로 추가했기 때문에 초기 버전에서는 더 이상 사용되지 않는 초기 버전의 SQL Server에서 많은 영리한 해결 방법을 보았습니다.

솔직히 기능이 된 적이없는 기능은 근본적으로 T-SQL 개발의 일부 측면을 위반했기 때문에 기능이되지 않았습니다. 기능의 부작용은 그중 하나입니다.


의견은 긴 토론을위한 것이 아닙니다. 이 대화는 채팅 으로 이동 되었습니다 .
Paul White 9
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.