{"Entry":{"collection":"sql","key":"alter-function","name":"ALTER FUNCTION","aliases":["alterfunction"],"metadata":{"aliases":["alterfunction"],"changed_in":["8.0","8.1","8.3","9.0","9.2","9.5","9.6","10","12","13","14"],"changes":[{"from":"7.3","purpose_changed":false,"renamed":null,"sections":{"added":[],"changed":[],"removed":[]},"status":"added","synopsis":null,"to":"7.4"},{"from":"7.4","purpose_changed":false,"renamed":null,"sections":{"added":[],"changed":["description","parameters","examples","compatibility"],"removed":[]},"status":"changed","synopsis":{"added":["ALTER FUNCTION name ( [ type [, ...] ] ) OWNER TO newowner"],"removed":[]},"to":"8.0"},{"from":"8.0","purpose_changed":false,"renamed":null,"sections":{"added":[],"changed":["description","parameters","examples","compatibility"],"removed":[]},"status":"changed","synopsis":{"added":["ALTER FUNCTION name ( [ [ argmode ] [ argname ] argtype [, ...] ] )","action [, ... ] [ RESTRICT ]","ALTER FUNCTION name ( [ [ argmode ] [ argname ] argtype [, ...] ] )","RENAME TO new_name","ALTER FUNCTION name ( [ [ argmode ] [ argname ] argtype [, ...] ] )","OWNER TO new_owner","ALTER FUNCTION name ( [ [ argmode ] [ argname ] argtype [, ...] ] )","SET SCHEMA new_schema","where action is one of:","CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT","IMMUTABLE | STABLE | VOLATILE","[ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER"],"removed":["ALTER FUNCTION name ( [ type [, ...] ] ) RENAME TO newname","ALTER FUNCTION name ( [ type [, ...] ] ) OWNER TO newowner"]},"to":"8.1"},{"from":"8.2","purpose_changed":false,"renamed":null,"sections":{"added":[],"changed":["parameters","examples","compatibility"],"removed":[]},"status":"changed","synopsis":{"added":["COST execution_cost","ROWS result_rows","SET configuration_parameter { TO | = } { value | DEFAULT }","SET configuration_parameter FROM CURRENT","RESET configuration_parameter","RESET ALL"],"removed":["action [, ... ] [ RESTRICT ]"]},"to":"8.3"},{"from":"8.3","purpose_changed":false,"renamed":null,"sections":{"added":[],"changed":["parameters"],"removed":[]},"status":"changed","synopsis":null,"to":"8.4"},{"from":"8.4","purpose_changed":false,"renamed":null,"sections":{"added":[],"changed":[],"removed":[]},"status":"changed","synopsis":{"added":[],"removed":["where action is one of:"]},"to":"9.0"},{"from":"9.0","purpose_changed":false,"renamed":null,"sections":{"added":[],"changed":["parameters"],"removed":[]},"status":"changed","synopsis":null,"to":"9.1"},{"from":"9.1","purpose_changed":false,"renamed":null,"sections":{"added":[],"changed":["parameters"],"removed":[]},"status":"changed","synopsis":{"added":["IMMUTABLE | STABLE | VOLATILE | [ NOT ] LEAKPROOF"],"removed":[]},"to":"9.2"},{"from":"9.4","purpose_changed":false,"renamed":null,"sections":{"added":[],"changed":[],"removed":[]},"status":"changed","synopsis":{"added":["OWNER TO { new_owner | CURRENT_USER | SESSION_USER }"],"removed":[]},"to":"9.5"},{"from":"9.5","purpose_changed":false,"renamed":null,"sections":{"added":[],"changed":["parameters","examples"],"removed":[]},"status":"changed","synopsis":{"added":["ALTER FUNCTION name ( [ [ argmode ] [ argname ] argtype [, ...] ] )","DEPENDS ON EXTENSION extension_name","PARALLEL { UNSAFE | RESTRICTED | SAFE }"],"removed":["IMMUTABLE | STABLE | VOLATILE | [ NOT ] LEAKPROOF"]},"to":"9.6"},{"from":"9.6","purpose_changed":false,"renamed":null,"sections":{"added":[],"changed":["parameters"],"removed":[]},"status":"changed","synopsis":{"added":["ALTER FUNCTION name [ ( [ [ argmode ] [ argname ] argtype [, ...] ] ) ]","ALTER FUNCTION name [ ( [ [ argmode ] [ argname ] argtype [, ...] ] ) ]","ALTER FUNCTION name [ ( [ [ argmode ] [ argname ] argtype [, ...] ] ) ]","ALTER FUNCTION name [ ( [ [ argmode ] [ argname ] argtype [, ...] ] ) ]","ALTER FUNCTION name [ ( [ [ argmode ] [ argname ] argtype [, ...] ] ) ]"],"removed":[]},"to":"10"},{"from":"10","purpose_changed":false,"renamed":null,"sections":{"added":[],"changed":["see_also"],"removed":[]},"status":"changed","synopsis":null,"to":"11"},{"from":"11","purpose_changed":false,"renamed":null,"sections":{"added":[],"changed":["parameters"],"removed":[]},"status":"changed","synopsis":{"added":["SUPPORT support_function"],"removed":[]},"to":"12"},{"from":"12","purpose_changed":false,"renamed":null,"sections":{"added":[],"changed":["parameters"],"removed":[]},"status":"changed","synopsis":{"added":["[ NO ] DEPENDS ON EXTENSION extension_name"],"removed":[]},"to":"13"},{"from":"13","purpose_changed":false,"renamed":null,"sections":{"added":[],"changed":["parameters"],"removed":[]},"status":"changed","synopsis":{"added":["OWNER TO { new_owner | CURRENT_ROLE | CURRENT_USER | SESSION_USER }"],"removed":[]},"to":"14"},{"from":"15","purpose_changed":false,"renamed":null,"sections":{"added":[],"changed":["description"],"removed":[]},"status":"changed","synopsis":null,"to":"16"},{"from":"16","purpose_changed":false,"renamed":null,"sections":{"added":[],"changed":["parameters"],"removed":[]},"status":"changed","synopsis":null,"to":"17"}],"content_hash":"f8bf3bc3dae8eb81e6666da7c6125aa4236424d6da70f85dc9c8f00642729255","editorial":{},"first_version":"7.4","group":"routine","imported_at":"2026-09-30T17:43:37.18544+08:00","last_version":"20","name":"ALTER FUNCTION","object":"FUNCTION","position":2006,"present_in":["7.4","8.0","8.1","8.2","8.3","8.4","9.0","9.1","9.2","9.3","9.4","9.5","9.6","10","11","12","13","14","15","16","17","18","19","20"],"purpose":"change the definition of a function","purpose_zh":"","related":["create-function","drop-function","alter-procedure","alter-routine"],"slug":"alter-function","source_rev":"a709ab85","synopsis":"ALTER FUNCTION name [ ( [ [ argmode ] [ argname ] argtype [, ...] ] ) ]\naction [ ... ] [ RESTRICT ]\nALTER FUNCTION name [ ( [ [ argmode ] [ argname ] argtype [, ...] ] ) ]\nRENAME TO new_name\nALTER FUNCTION name [ ( [ [ argmode ] [ argname ] argtype [, ...] ] ) ]\nOWNER TO { new_owner | CURRENT_ROLE | CURRENT_USER | SESSION_USER }\nALTER FUNCTION name [ ( [ [ argmode ] [ argname ] argtype [, ...] ] ) ]\nSET SCHEMA new_schema\nALTER FUNCTION name [ ( [ [ argmode ] [ argname ] argtype [, ...] ] ) ]\n[ NO ] DEPENDS ON EXTENSION extension_name\nwhere action is one of:\n\nCALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT\nIMMUTABLE | STABLE | VOLATILE\n[ NOT ] LEAKPROOF\n[ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER\nPARALLEL { UNSAFE | RESTRICTED | SAFE }\nCOST execution_cost\nROWS result_rows\nSUPPORT support_function\nSET configuration_parameter { TO | = } { value | DEFAULT }\nSET configuration_parameter FROM CURRENT\nRESET configuration_parameter\nRESET ALL","verb":"ALTER"}},"Definition":{"Collection":"sql","Key":"alter-function","SourceDatabase":"center","Version":"18","SourceTable":"sqlcmd","SourceKey":"alter-function","SourceRevision":"a709ab85","Facts":{"anchor":"SQL-ALTERFUNCTION","file":"sql-alterfunction.html","lang":"en","name":"ALTER FUNCTION","purpose":"change the definition of a function","purpose_zh":"","related":["create-function","drop-function","alter-procedure","alter-routine"],"sections":[{"html":"\u003cp\u003e\u003ccode class=\"command\"\u003eALTER FUNCTION\u003c/code\u003e changes the definition of a function.\u003c/p\u003e\u003cp\u003eYou must own the function to use \u003ccode class=\"command\"\u003eALTER FUNCTION\u003c/code\u003e. To change a function's schema, you must also have \u003ccode class=\"literal\"\u003eCREATE\u003c/code\u003e privilege on the new schema. To alter the owner, you must be able to \u003ccode class=\"literal\"\u003eSET ROLE\u003c/code\u003e to the new owning role, and that role must have \u003ccode class=\"literal\"\u003eCREATE\u003c/code\u003e privilege on the function's schema. (These restrictions enforce that altering the owner doesn't do anything you couldn't do by dropping and recreating the function. However, a superuser can alter ownership of any function anyway.)\u003c/p\u003e","key":"description","title":"Description"},{"html":"\u003cdiv class=\"variablelist\"\u003e\u003cdl class=\"variablelist\"\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003cem class=\"replaceable\"\u003e\u003ccode\u003ename\u003c/code\u003e\u003c/em\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003eThe name (optionally schema-qualified) of an existing function. If no argument list is specified, the name must be unique in its schema.\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003cem class=\"replaceable\"\u003e\u003ccode\u003eargmode\u003c/code\u003e\u003c/em\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003eThe mode of an argument: \u003ccode class=\"literal\"\u003eIN\u003c/code\u003e, \u003ccode class=\"literal\"\u003eOUT\u003c/code\u003e, \u003ccode class=\"literal\"\u003eINOUT\u003c/code\u003e, or \u003ccode class=\"literal\"\u003eVARIADIC\u003c/code\u003e. If omitted, the default is \u003ccode class=\"literal\"\u003eIN\u003c/code\u003e. Note that \u003ccode class=\"command\"\u003eALTER FUNCTION\u003c/code\u003e does not actually pay any attention to \u003ccode class=\"literal\"\u003eOUT\u003c/code\u003e arguments, since only the input arguments are needed to determine the function's identity. So it is sufficient to list the \u003ccode class=\"literal\"\u003eIN\u003c/code\u003e, \u003ccode class=\"literal\"\u003eINOUT\u003c/code\u003e, and \u003ccode class=\"literal\"\u003eVARIADIC\u003c/code\u003e arguments.\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003cem class=\"replaceable\"\u003e\u003ccode\u003eargname\u003c/code\u003e\u003c/em\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003eThe name of an argument. Note that \u003ccode class=\"command\"\u003eALTER FUNCTION\u003c/code\u003e does not actually pay any attention to argument names, since only the argument data types are needed to determine the function's identity.\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003cem class=\"replaceable\"\u003e\u003ccode\u003eargtype\u003c/code\u003e\u003c/em\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003eThe data type(s) of the function's arguments (optionally schema-qualified), if any.\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003cem class=\"replaceable\"\u003e\u003ccode\u003enew_name\u003c/code\u003e\u003c/em\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003eThe new name of the function.\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003cem class=\"replaceable\"\u003e\u003ccode\u003enew_owner\u003c/code\u003e\u003c/em\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003eThe new owner of the function. Note that if the function is marked \u003ccode class=\"literal\"\u003eSECURITY DEFINER\u003c/code\u003e, it will subsequently execute as the new owner.\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003cem class=\"replaceable\"\u003e\u003ccode\u003enew_schema\u003c/code\u003e\u003c/em\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003eThe new schema for the function.\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003ccode class=\"literal\"\u003eDEPENDS ON EXTENSION \u003cem class=\"replaceable\"\u003e\u003ccode\u003eextension_name\u003c/code\u003e\u003c/em\u003e\u003c/code\u003e\u003cbr\u003e\u003c/span\u003e\u003cspan class=\"term\"\u003e\u003ccode class=\"literal\"\u003eNO DEPENDS ON EXTENSION \u003cem class=\"replaceable\"\u003e\u003ccode\u003eextension_name\u003c/code\u003e\u003c/em\u003e\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003eThis form marks the function as dependent on the extension, or no longer dependent on that extension if \u003ccode class=\"literal\"\u003eNO\u003c/code\u003e is specified. A function that's marked as dependent on an extension is dropped when the extension is dropped, even if \u003ccode class=\"literal\"\u003eCASCADE\u003c/code\u003e is not specified. A function can depend upon multiple extensions, and will be dropped when any one of those extensions is dropped.\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003ccode class=\"literal\"\u003eCALLED ON NULL INPUT\u003c/code\u003e\u003cbr\u003e\u003c/span\u003e\u003cspan class=\"term\"\u003e\u003ccode class=\"literal\"\u003eRETURNS NULL ON NULL INPUT\u003c/code\u003e\u003cbr\u003e\u003c/span\u003e\u003cspan class=\"term\"\u003e\u003ccode class=\"literal\"\u003eSTRICT\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e\u003ccode class=\"literal\"\u003eCALLED ON NULL INPUT\u003c/code\u003e changes the function so that it will be invoked when some or all of its arguments are null. \u003ccode class=\"literal\"\u003eRETURNS NULL ON NULL INPUT\u003c/code\u003e or \u003ccode class=\"literal\"\u003eSTRICT\u003c/code\u003e changes the function so that it is not invoked if any of its arguments are null; instead, a null result is assumed automatically. See \u003ca href=\"/docs/18/sql-createfunction.html\" title=\"CREATE FUNCTION\"\u003e\u003cspan class=\"refentrytitle\"\u003eCREATE FUNCTION\u003c/span\u003e\u003c/a\u003e for more information.\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003ccode class=\"literal\"\u003eIMMUTABLE\u003c/code\u003e\u003cbr\u003e\u003c/span\u003e\u003cspan class=\"term\"\u003e\u003ccode class=\"literal\"\u003eSTABLE\u003c/code\u003e\u003cbr\u003e\u003c/span\u003e\u003cspan class=\"term\"\u003e\u003ccode class=\"literal\"\u003eVOLATILE\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003eChange the volatility of the function to the specified setting. See \u003ca href=\"/docs/18/sql-createfunction.html\" title=\"CREATE FUNCTION\"\u003e\u003cspan class=\"refentrytitle\"\u003eCREATE FUNCTION\u003c/span\u003e\u003c/a\u003e for details.\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003ccode class=\"literal\"\u003e[ \u003cspan class=\"optional\"\u003eEXTERNAL\u003c/span\u003e ] SECURITY INVOKER\u003c/code\u003e\u003cbr\u003e\u003c/span\u003e\u003cspan class=\"term\"\u003e\u003ccode class=\"literal\"\u003e[ \u003cspan class=\"optional\"\u003eEXTERNAL\u003c/span\u003e ] SECURITY DEFINER\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003eChange whether the function is a security definer or not. The key word \u003ccode class=\"literal\"\u003eEXTERNAL\u003c/code\u003e is ignored for SQL conformance. See \u003ca href=\"/docs/18/sql-createfunction.html\" title=\"CREATE FUNCTION\"\u003e\u003cspan class=\"refentrytitle\"\u003eCREATE FUNCTION\u003c/span\u003e\u003c/a\u003e for more information about this capability.\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003ccode class=\"literal\"\u003ePARALLEL\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003eChange whether the function is deemed safe for parallelism. See \u003ca href=\"/docs/18/sql-createfunction.html\" title=\"CREATE FUNCTION\"\u003e\u003cspan class=\"refentrytitle\"\u003eCREATE FUNCTION\u003c/span\u003e\u003c/a\u003e for details.\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003ccode class=\"literal\"\u003eLEAKPROOF\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003eChange whether the function is considered leakproof or not. See \u003ca href=\"/docs/18/sql-createfunction.html\" title=\"CREATE FUNCTION\"\u003e\u003cspan class=\"refentrytitle\"\u003eCREATE FUNCTION\u003c/span\u003e\u003c/a\u003e for more information about this capability.\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003ccode class=\"literal\"\u003eCOST\u003c/code\u003e \u003cem class=\"replaceable\"\u003e\u003ccode\u003eexecution_cost\u003c/code\u003e\u003c/em\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003eChange the estimated execution cost of the function. See \u003ca href=\"/docs/18/sql-createfunction.html\" title=\"CREATE FUNCTION\"\u003e\u003cspan class=\"refentrytitle\"\u003eCREATE FUNCTION\u003c/span\u003e\u003c/a\u003e for more information.\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003ccode class=\"literal\"\u003eROWS\u003c/code\u003e \u003cem class=\"replaceable\"\u003e\u003ccode\u003eresult_rows\u003c/code\u003e\u003c/em\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003eChange the estimated number of rows returned by a set-returning function. See \u003ca href=\"/docs/18/sql-createfunction.html\" title=\"CREATE FUNCTION\"\u003e\u003cspan class=\"refentrytitle\"\u003eCREATE FUNCTION\u003c/span\u003e\u003c/a\u003e for more information.\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003ccode class=\"literal\"\u003eSUPPORT\u003c/code\u003e \u003cem class=\"replaceable\"\u003e\u003ccode\u003esupport_function\u003c/code\u003e\u003c/em\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003eSet or change the planner support function to use for this function. See \u003ca href=\"/docs/18/xfunc-optimization.html\" title=\"36.11. Function Optimization Information\"\u003eSection 36.11\u003c/a\u003e for details. You must be superuser to use this option.\u003c/p\u003e\u003cp\u003eThis option cannot be used to remove the support function altogether, since it must name a new support function. Use \u003ccode class=\"command\"\u003eCREATE OR REPLACE FUNCTION\u003c/code\u003e if you need to do that.\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003cem class=\"replaceable\"\u003e\u003ccode\u003econfiguration_parameter\u003c/code\u003e\u003c/em\u003e\u003cbr\u003e\u003c/span\u003e\u003cspan class=\"term\"\u003e\u003cem class=\"replaceable\"\u003e\u003ccode\u003evalue\u003c/code\u003e\u003c/em\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003eAdd or change the assignment to be made to a configuration parameter when the function is called. If \u003cem class=\"replaceable\"\u003e\u003ccode\u003evalue\u003c/code\u003e\u003c/em\u003e is \u003ccode class=\"literal\"\u003eDEFAULT\u003c/code\u003e or, equivalently, \u003ccode class=\"literal\"\u003eRESET\u003c/code\u003e is used, the function-local setting is removed, so that the function executes with the value present in its environment. Use \u003ccode class=\"literal\"\u003eRESET ALL\u003c/code\u003e to clear all function-local settings. \u003ccode class=\"literal\"\u003eSET FROM CURRENT\u003c/code\u003e saves the value of the parameter that is current when \u003ccode class=\"command\"\u003eALTER FUNCTION\u003c/code\u003e is executed as the value to be applied when the function is entered.\u003c/p\u003e\u003cp\u003eSee \u003ca href=\"/docs/18/sql-set.html\" title=\"SET\"\u003e\u003cspan class=\"refentrytitle\"\u003eSET\u003c/span\u003e\u003c/a\u003e and \u003ca href=\"/docs/18/runtime-config.html\" title=\"Chapter 19. Server Configuration\"\u003eChapter 19\u003c/a\u003e for more information about allowed parameter names and values.\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003ccode class=\"literal\"\u003eRESTRICT\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003eIgnored for conformance with the SQL standard.\u003c/p\u003e\u003c/dd\u003e\u003c/dl\u003e\u003c/div\u003e","key":"parameters","title":"Parameters"},{"html":"\u003cp\u003eTo rename the function \u003ccode class=\"literal\"\u003esqrt\u003c/code\u003e for type \u003ccode class=\"type\"\u003einteger\u003c/code\u003e to \u003ccode class=\"literal\"\u003esquare_root\u003c/code\u003e:\u003c/p\u003e\u003cpre class=\"programlisting\"\u003eALTER FUNCTION sqrt(integer) RENAME TO square_root;\n\u003c/pre\u003e\u003cp\u003eTo change the owner of the function \u003ccode class=\"literal\"\u003esqrt\u003c/code\u003e for type \u003ccode class=\"type\"\u003einteger\u003c/code\u003e to \u003ccode class=\"literal\"\u003ejoe\u003c/code\u003e:\u003c/p\u003e\u003cpre class=\"programlisting\"\u003eALTER FUNCTION sqrt(integer) OWNER TO joe;\n\u003c/pre\u003e\u003cp\u003eTo change the schema of the function \u003ccode class=\"literal\"\u003esqrt\u003c/code\u003e for type \u003ccode class=\"type\"\u003einteger\u003c/code\u003e to \u003ccode class=\"literal\"\u003emaths\u003c/code\u003e:\u003c/p\u003e\u003cpre class=\"programlisting\"\u003eALTER FUNCTION sqrt(integer) SET SCHEMA maths;\n\u003c/pre\u003e\u003cp\u003eTo mark the function \u003ccode class=\"literal\"\u003esqrt\u003c/code\u003e for type \u003ccode class=\"type\"\u003einteger\u003c/code\u003e as being dependent on the extension \u003ccode class=\"literal\"\u003emathlib\u003c/code\u003e:\u003c/p\u003e\u003cpre class=\"programlisting\"\u003eALTER FUNCTION sqrt(integer) DEPENDS ON EXTENSION mathlib;\n\u003c/pre\u003e\u003cp\u003eTo adjust the search path that is automatically set for a function:\u003c/p\u003e\u003cpre class=\"programlisting\"\u003eALTER FUNCTION check_password(text) SET search_path = admin, pg_temp;\n\u003c/pre\u003e\u003cp\u003eTo disable automatic setting of \u003ccode class=\"varname\"\u003esearch_path\u003c/code\u003e for a function:\u003c/p\u003e\u003cpre class=\"programlisting\"\u003eALTER FUNCTION check_password(text) RESET search_path;\n\u003c/pre\u003e\u003cp\u003eThe function will now execute with whatever search path is used by its caller.\u003c/p\u003e","key":"examples","title":"Examples"},{"html":"\u003cp\u003eThis statement is partially compatible with the \u003ccode class=\"command\"\u003eALTER FUNCTION\u003c/code\u003e statement in the SQL standard. The standard allows more properties of a function to be modified, but does not provide the ability to rename a function, make a function a security definer, attach configuration parameter values to a function, or change the owner, schema, or volatility of a function. The standard also requires the \u003ccode class=\"literal\"\u003eRESTRICT\u003c/code\u003e key word, which is optional in \u003cspan class=\"productname\"\u003ePostgreSQL\u003c/span\u003e.\u003c/p\u003e","key":"compatibility","title":"Compatibility"},{"html":"\u003cspan class=\"simplelist\"\u003e\u003ca href=\"/wiki/sql/create-function/?v=18\" title=\"CREATE FUNCTION\"\u003e\u003cspan class=\"refentrytitle\"\u003eCREATE FUNCTION\u003c/span\u003e\u003c/a\u003e, \u003ca href=\"/wiki/sql/drop-function/?v=18\" title=\"DROP FUNCTION\"\u003e\u003cspan class=\"refentrytitle\"\u003eDROP FUNCTION\u003c/span\u003e\u003c/a\u003e, \u003ca href=\"/wiki/sql/alter-procedure/?v=18\" title=\"ALTER PROCEDURE\"\u003e\u003cspan class=\"refentrytitle\"\u003eALTER PROCEDURE\u003c/span\u003e\u003c/a\u003e, \u003ca href=\"/wiki/sql/alter-routine/?v=18\" title=\"ALTER ROUTINE\"\u003e\u003cspan class=\"refentrytitle\"\u003eALTER ROUTINE\u003c/span\u003e\u003c/a\u003e\u003c/span\u003e","key":"see_also","title":"See Also"}],"sections_same_as":"","slug":"18","synopsis_html":"ALTER FUNCTION \u003cem class=\"replaceable\"\u003e\u003ccode\u003ename\u003c/code\u003e\u003c/em\u003e [ ( [ [ \u003cem class=\"replaceable\"\u003e\u003ccode\u003eargmode\u003c/code\u003e\u003c/em\u003e ] [ \u003cem class=\"replaceable\"\u003e\u003ccode\u003eargname\u003c/code\u003e\u003c/em\u003e ] \u003cem class=\"replaceable\"\u003e\u003ccode\u003eargtype\u003c/code\u003e\u003c/em\u003e [, ...] ] ) ]\n    \u003cem class=\"replaceable\"\u003e\u003ccode\u003eaction\u003c/code\u003e\u003c/em\u003e [ ... ] [ RESTRICT ]\nALTER FUNCTION \u003cem class=\"replaceable\"\u003e\u003ccode\u003ename\u003c/code\u003e\u003c/em\u003e [ ( [ [ \u003cem class=\"replaceable\"\u003e\u003ccode\u003eargmode\u003c/code\u003e\u003c/em\u003e ] [ \u003cem class=\"replaceable\"\u003e\u003ccode\u003eargname\u003c/code\u003e\u003c/em\u003e ] \u003cem class=\"replaceable\"\u003e\u003ccode\u003eargtype\u003c/code\u003e\u003c/em\u003e [, ...] ] ) ]\n    RENAME TO \u003cem class=\"replaceable\"\u003e\u003ccode\u003enew_name\u003c/code\u003e\u003c/em\u003e\nALTER FUNCTION \u003cem class=\"replaceable\"\u003e\u003ccode\u003ename\u003c/code\u003e\u003c/em\u003e [ ( [ [ \u003cem class=\"replaceable\"\u003e\u003ccode\u003eargmode\u003c/code\u003e\u003c/em\u003e ] [ \u003cem class=\"replaceable\"\u003e\u003ccode\u003eargname\u003c/code\u003e\u003c/em\u003e ] \u003cem class=\"replaceable\"\u003e\u003ccode\u003eargtype\u003c/code\u003e\u003c/em\u003e [, ...] ] ) ]\n    OWNER TO { \u003cem class=\"replaceable\"\u003e\u003ccode\u003enew_owner\u003c/code\u003e\u003c/em\u003e | CURRENT_ROLE | CURRENT_USER | SESSION_USER }\nALTER FUNCTION \u003cem class=\"replaceable\"\u003e\u003ccode\u003ename\u003c/code\u003e\u003c/em\u003e [ ( [ [ \u003cem class=\"replaceable\"\u003e\u003ccode\u003eargmode\u003c/code\u003e\u003c/em\u003e ] [ \u003cem class=\"replaceable\"\u003e\u003ccode\u003eargname\u003c/code\u003e\u003c/em\u003e ] \u003cem class=\"replaceable\"\u003e\u003ccode\u003eargtype\u003c/code\u003e\u003c/em\u003e [, ...] ] ) ]\n    SET SCHEMA \u003cem class=\"replaceable\"\u003e\u003ccode\u003enew_schema\u003c/code\u003e\u003c/em\u003e\nALTER FUNCTION \u003cem class=\"replaceable\"\u003e\u003ccode\u003ename\u003c/code\u003e\u003c/em\u003e [ ( [ [ \u003cem class=\"replaceable\"\u003e\u003ccode\u003eargmode\u003c/code\u003e\u003c/em\u003e ] [ \u003cem class=\"replaceable\"\u003e\u003ccode\u003eargname\u003c/code\u003e\u003c/em\u003e ] \u003cem class=\"replaceable\"\u003e\u003ccode\u003eargtype\u003c/code\u003e\u003c/em\u003e [, ...] ] ) ]\n    [ NO ] DEPENDS ON EXTENSION \u003cem class=\"replaceable\"\u003e\u003ccode\u003eextension_name\u003c/code\u003e\u003c/em\u003e\n\n\u003cspan class=\"phrase\"\u003ewhere \u003cem class=\"replaceable\"\u003e\u003ccode\u003eaction\u003c/code\u003e\u003c/em\u003e is one of:\u003c/span\u003e\n\n    CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT\n    IMMUTABLE | STABLE | VOLATILE\n    [ NOT ] LEAKPROOF\n    [ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER\n    PARALLEL { UNSAFE | RESTRICTED | SAFE }\n    COST \u003cem class=\"replaceable\"\u003e\u003ccode\u003eexecution_cost\u003c/code\u003e\u003c/em\u003e\n    ROWS \u003cem class=\"replaceable\"\u003e\u003ccode\u003eresult_rows\u003c/code\u003e\u003c/em\u003e\n    SUPPORT \u003cem class=\"replaceable\"\u003e\u003ccode\u003esupport_function\u003c/code\u003e\u003c/em\u003e\n    SET \u003cem class=\"replaceable\"\u003e\u003ccode\u003econfiguration_parameter\u003c/code\u003e\u003c/em\u003e { TO | = } { \u003cem class=\"replaceable\"\u003e\u003ccode\u003evalue\u003c/code\u003e\u003c/em\u003e | DEFAULT }\n    SET \u003cem class=\"replaceable\"\u003e\u003ccode\u003econfiguration_parameter\u003c/code\u003e\u003c/em\u003e FROM CURRENT\n    RESET \u003cem class=\"replaceable\"\u003e\u003ccode\u003econfiguration_parameter\u003c/code\u003e\u003c/em\u003e\n    RESET ALL","synopsis_text":"ALTER FUNCTION name [ ( [ [ argmode ] [ argname ] argtype [, ...] ] ) ]\naction [ ... ] [ RESTRICT ]\nALTER FUNCTION name [ ( [ [ argmode ] [ argname ] argtype [, ...] ] ) ]\nRENAME TO new_name\nALTER FUNCTION name [ ( [ [ argmode ] [ argname ] argtype [, ...] ] ) ]\nOWNER TO { new_owner | CURRENT_ROLE | CURRENT_USER | SESSION_USER }\nALTER FUNCTION name [ ( [ [ argmode ] [ argname ] argtype [, ...] ] ) ]\nSET SCHEMA new_schema\nALTER FUNCTION name [ ( [ [ argmode ] [ argname ] argtype [, ...] ] ) ]\n[ NO ] DEPENDS ON EXTENSION extension_name\nwhere action is one of:\n\nCALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT\nIMMUTABLE | STABLE | VOLATILE\n[ NOT ] LEAKPROOF\n[ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER\nPARALLEL { UNSAFE | RESTRICTED | SAFE }\nCOST execution_cost\nROWS result_rows\nSUPPORT support_function\nSET configuration_parameter { TO | = } { value | DEFAULT }\nSET configuration_parameter FROM CURRENT\nRESET configuration_parameter\nRESET ALL"},"ManualEvidence":{},"MeasuredEvidence":{}},"Text":{"Collection":"sql","Key":"alter-function","SourceDatabase":"pgweb","Version":"18","Locale":"zh-Hans","Title":"ALTER FUNCTION","Summary":"更改函数的定义","BodyHTML":"\u003cpre\u003eALTER FUNCTION name [ ( [ [ argmode ] [ argname ] argtype [, ...] ] ) ]\naction [ ... ] [ RESTRICT ]\nALTER FUNCTION name [ ( [ [ argmode ] [ argname ] argtype [, ...] ] ) ]\nRENAME TO new_name\nALTER FUNCTION name [ ( [ [ argmode ] [ argname ] argtype [, ...] ] ) ]\nOWNER TO { new_owner | CURRENT_ROLE | CURRENT_USER | SESSION_USER }\nALTER FUNCTION name [ ( [ [ argmode ] [ argname ] argtype [, ...] ] ) ]\nSET SCHEMA new_schema\nALTER FUNCTION name [ ( [ [ argmode ] [ argname ] argtype [, ...] ] ) ]\n[ NO ] DEPENDS ON EXTENSION extension_name\n其中 action 是以下之一：\n\nCALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT\nIMMUTABLE | STABLE | VOLATILE\n[ NOT ] LEAKPROOF\n[ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER\nPARALLEL { UNSAFE | RESTRICTED | SAFE }\nCOST execution_cost\nROWS result_rows\nSUPPORT support_function\nSET configuration_parameter { TO | = } { value | DEFAULT }\nSET configuration_parameter FROM CURRENT\nRESET configuration_parameter\nRESET ALL\u003c/pre\u003e\u003csection\u003e\u003ch2\u003e描述\u003c/h2\u003e\u003cp\u003e\u003ccode\u003eALTER FUNCTION\u003c/code\u003e更改函数的定义。\u003c/p\u003e\u003cp\u003e要使用\u003ccode\u003eALTER FUNCTION\u003c/code\u003e，你必须拥有该函数。要更改函数的模式，你还必须在新模式上具有\u003ccode\u003eCREATE\u003c/code\u003e权限。要更改拥有者，你必须能够对新的拥有角色执行\u003ccode\u003eSET ROLE\u003c/code\u003e，并且该角色必须在函数所在模式上具有\u003ccode\u003eCREATE\u003c/code\u003e权限。（这些限制确保更改拥有者不会做出任何你无法通过删除并重新创建该函数来完成的事情。不过，超级用户仍然可以更改任何函数的所有权。）\u003c/p\u003e\u003c/section\u003e\u003csection\u003e\u003ch2\u003e参数\u003c/h2\u003e\u003cdiv\u003e\u003cdl\u003e\u003cdt\u003e\u003cspan\u003e\u003cem\u003e\u003ccode\u003ename\u003c/code\u003e\u003c/em\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e现有函数的名称（可以用模式限定）。如果没有指定参数列表，这个名称必须在其模式中唯一。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan\u003e\u003cem\u003e\u003ccode\u003eargmode\u003c/code\u003e\u003c/em\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e参数的模式：\u003ccode\u003eIN\u003c/code\u003e、\u003ccode\u003eOUT\u003c/code\u003e、\u003ccode\u003eINOUT\u003c/code\u003e或\u003ccode\u003eVARIADIC\u003c/code\u003e。如果省略，默认为\u003ccode\u003eIN\u003c/code\u003e。注意\u003ccode\u003eALTER FUNCTION\u003c/code\u003e 实际上并不关心任何\u003ccode\u003eOUT\u003c/code\u003e参数，因为确定函数身份只需要输入参数。因此，只列出\u003ccode\u003eIN\u003c/code\u003e、\u003ccode\u003eINOUT\u003c/code\u003e和\u003ccode\u003eVARIADIC\u003c/code\u003e参数就足够了。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan\u003e\u003cem\u003e\u003ccode\u003eargname\u003c/code\u003e\u003c/em\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e参数的名称。注意\u003ccode\u003eALTER FUNCTION\u003c/code\u003e实际上并不关心参数名，因为确定函数身份只需要参数数据类型。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan\u003e\u003cem\u003e\u003ccode\u003eargtype\u003c/code\u003e\u003c/em\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e函数参数的数据类型（如果有，可以用模式限定）。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan\u003e\u003cem\u003e\u003ccode\u003enew_name\u003c/code\u003e\u003c/em\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e该函数的新名称。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan\u003e\u003cem\u003e\u003ccode\u003enew_owner\u003c/code\u003e\u003c/em\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e该函数的新拥有者。注意，如果该函数被标记为 \u003ccode\u003eSECURITY DEFINER\u003c/code\u003e，随后它将以新拥有者的身份执行。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan\u003e\u003cem\u003e\u003ccode\u003enew_schema\u003c/code\u003e\u003c/em\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e该函数的新模式。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan\u003e\u003ccode\u003eDEPENDS ON EXTENSION \u003cem\u003e\u003ccode\u003eextension_name\u003c/code\u003e\u003c/em\u003e\u003c/code\u003e\u003cbr\u003e\u003c/span\u003e\u003cspan\u003e\u003ccode\u003eNO DEPENDS ON EXTENSION \u003cem\u003e\u003ccode\u003eextension_name\u003c/code\u003e\u003c/em\u003e\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e这种形式会将函数标记为依赖于该扩展；如果指定了\u003ccode\u003eNO\u003c/code\u003e，则表示不再依赖该扩展。被标记为依赖扩展的函数会在扩展被删除时一并删除，即使没有指定\u003ccode\u003eCASCADE\u003c/code\u003e也是如此。一个函数可以依赖多个扩展，其中任意一个扩展被删除时，该函数都会被删除。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan\u003e\u003ccode\u003eCALLED ON NULL INPUT\u003c/code\u003e\u003cbr\u003e\u003c/span\u003e\u003cspan\u003e\u003ccode\u003eRETURNS NULL ON NULL INPUT\u003c/code\u003e\u003cbr\u003e\u003c/span\u003e\u003cspan\u003e\u003ccode\u003eSTRICT\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e\u003ccode\u003eCALLED ON NULL INPUT\u003c/code\u003e将该函数改为在其部分或全部参数为 null 时仍会被调用。\u003ccode\u003eRETURNS NULL ON NULL INPUT\u003c/code\u003e或 \u003ccode\u003eSTRICT\u003c/code\u003e将该函数改为只要任一参数为 null 就不调用，而是自动假定结果为 null。详见\u003ca href=\"/docs/18/sql-createfunction.html\" title=\"CREATE FUNCTION\" rel=\"nofollow\"\u003e\u003cspan\u003eCREATE FUNCTION\u003c/span\u003e\u003c/a\u003e。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan\u003e\u003ccode\u003eIMMUTABLE\u003c/code\u003e\u003cbr\u003e\u003c/span\u003e\u003cspan\u003e\u003ccode\u003eSTABLE\u003c/code\u003e\u003cbr\u003e\u003c/span\u003e\u003cspan\u003e\u003ccode\u003eVOLATILE\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e将该函数的易变性更改为指定的设置。详见\u003ca href=\"/docs/18/sql-createfunction.html\" title=\"CREATE FUNCTION\" rel=\"nofollow\"\u003e\u003cspan\u003eCREATE FUNCTION\u003c/span\u003e\u003c/a\u003e。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan\u003e\u003ccode\u003e[ \u003cspan\u003eEXTERNAL\u003c/span\u003e ] SECURITY INVOKER\u003c/code\u003e\u003cbr\u003e\u003c/span\u003e\u003cspan\u003e\u003ccode\u003e[ \u003cspan\u003eEXTERNAL\u003c/span\u003e ] SECURITY DEFINER\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e更改该函数是否为安全性定义者。关键字\u003ccode\u003eEXTERNAL\u003c/code\u003e 为了符合 SQL 标准而被忽略。关于这一能力的更多信息，参见\u003ca href=\"/docs/18/sql-createfunction.html\" title=\"CREATE FUNCTION\" rel=\"nofollow\"\u003e\u003cspan\u003eCREATE FUNCTION\u003c/span\u003e\u003c/a\u003e。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan\u003e\u003ccode\u003ePARALLEL\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e更改该函数是否被视为对并行执行安全。详见\u003ca href=\"/docs/18/sql-createfunction.html\" title=\"CREATE FUNCTION\" rel=\"nofollow\"\u003e\u003cspan\u003eCREATE FUNCTION\u003c/span\u003e\u003c/a\u003e。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan\u003e\u003ccode\u003eLEAKPROOF\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e更改该函数是否被视为防泄漏的。关于这一能力的更多信息，参见\u003ca href=\"/docs/18/sql-createfunction.html\" title=\"CREATE FUNCTION\" rel=\"nofollow\"\u003e\u003cspan\u003eCREATE FUNCTION\u003c/span\u003e\u003c/a\u003e。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan\u003e\u003ccode\u003eCOST\u003c/code\u003e \u003cem\u003e\u003ccode\u003eexecution_cost\u003c/code\u003e\u003c/em\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e更改该函数的估计执行代价。详见\u003ca href=\"/docs/18/sql-createfunction.html\" title=\"CREATE FUNCTION\" rel=\"nofollow\"\u003e\u003cspan\u003eCREATE FUNCTION\u003c/span\u003e\u003c/a\u003e。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan\u003e\u003ccode\u003eROWS\u003c/code\u003e \u003cem\u003e\u003ccode\u003eresult_rows\u003c/code\u003e\u003c/em\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e更改集合返回函数估计返回的行数。详见\u003ca href=\"/docs/18/sql-createfunction.html\" title=\"CREATE FUNCTION\" rel=\"nofollow\"\u003e\u003cspan\u003eCREATE FUNCTION\u003c/span\u003e\u003c/a\u003e。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan\u003e\u003ccode\u003eSUPPORT\u003c/code\u003e \u003cem\u003e\u003ccode\u003esupport_function\u003c/code\u003e\u003c/em\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e设置或更改该函数要使用的规划器支持函数。详见\u003ca href=\"/docs/18/xfunc-optimization.html\" rel=\"nofollow\"\u003e第 36.11 节\u003c/a\u003e。你必须是超级用户才能使用此选项。\u003c/p\u003e\u003cp\u003e此选项不能用于完全删除支持函数，因为它必须指定一个新的支持函数。如果需要这样做，请使用\u003ccode\u003eCREATE OR REPLACE FUNCTION\u003c/code\u003e。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan\u003e\u003cem\u003e\u003ccode\u003econfiguration_parameter\u003c/code\u003e\u003c/em\u003e\u003cbr\u003e\u003c/span\u003e\u003cspan\u003e\u003cem\u003e\u003ccode\u003evalue\u003c/code\u003e\u003c/em\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e添加或更改在调用该函数时要赋给某个配置参数的值。如果 \u003cem\u003e\u003ccode\u003evalue\u003c/code\u003e\u003c/em\u003e是\u003ccode\u003eDEFAULT\u003c/code\u003e，或者等效地使用了\u003ccode\u003eRESET\u003c/code\u003e，则会移除函数局部设置，这样该函数就会使用其环境中现有的值执行。使用\u003ccode\u003eRESET ALL\u003c/code\u003e 可以清除所有函数局部设置。\u003ccode\u003eSET FROM CURRENT\u003c/code\u003e 会把执行\u003ccode\u003eALTER FUNCTION\u003c/code\u003e时该参数的当前值保存为进入函数时要应用的值。\u003c/p\u003e\u003cp\u003e关于允许的参数名和值的更多信息，参见\u003ca href=\"/docs/18/sql-set.html\" title=\"SET\" rel=\"nofollow\"\u003e\u003cspan\u003eSET\u003c/span\u003e\u003c/a\u003e和\u003ca href=\"/docs/18/runtime-config.html\" rel=\"nofollow\"\u003e第 19 章\u003c/a\u003e。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan\u003e\u003ccode\u003eRESTRICT\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e为符合 SQL 标准而被忽略。\u003c/p\u003e\u003c/dd\u003e\u003c/dl\u003e\u003c/div\u003e\u003c/section\u003e\u003csection\u003e\u003ch2\u003e示例\u003c/h2\u003e\u003cp\u003e要将类型\u003ccode\u003einteger\u003c/code\u003e的函数\u003ccode\u003esqrt\u003c/code\u003e 重命名为\u003ccode\u003esquare_root\u003c/code\u003e：\u003c/p\u003e\u003cpre\u003eALTER FUNCTION sqrt(integer) RENAME TO square_root;\n\u003c/pre\u003e\u003cp\u003e要将类型\u003ccode\u003einteger\u003c/code\u003e的函数\u003ccode\u003esqrt\u003c/code\u003e 的拥有者改为\u003ccode\u003ejoe\u003c/code\u003e：\u003c/p\u003e\u003cpre\u003eALTER FUNCTION sqrt(integer) OWNER TO joe;\n\u003c/pre\u003e\u003cp\u003e要将类型\u003ccode\u003einteger\u003c/code\u003e的函数\u003ccode\u003esqrt\u003c/code\u003e 的模式改为\u003ccode\u003emaths\u003c/code\u003e：\u003c/p\u003e\u003cpre\u003eALTER FUNCTION sqrt(integer) SET SCHEMA maths;\n\u003c/pre\u003e\u003cp\u003e要将类型\u003ccode\u003einteger\u003c/code\u003e的函数\u003ccode\u003esqrt\u003c/code\u003e 标记为依赖于扩展\u003ccode\u003emathlib\u003c/code\u003e：\u003c/p\u003e\u003cpre\u003eALTER FUNCTION sqrt(integer) DEPENDS ON EXTENSION mathlib;\n\u003c/pre\u003e\u003cp\u003e要调整自动为函数设置的搜索路径：\u003c/p\u003e\u003cpre\u003eALTER FUNCTION check_password(text) SET search_path = admin, pg_temp;\n\u003c/pre\u003e\u003cp\u003e要禁用为函数自动设置\u003ccode\u003esearch_path\u003c/code\u003e：\u003c/p\u003e\u003cpre\u003eALTER FUNCTION check_password(text) RESET search_path;\n\u003c/pre\u003e\u003cp\u003e现在该函数将使用其调用者所使用的搜索路径执行。\u003c/p\u003e\u003c/section\u003e\u003csection\u003e\u003ch2\u003e兼容性\u003c/h2\u003e\u003cp\u003e该语句与 SQL 标准中的\u003ccode\u003eALTER FUNCTION\u003c/code\u003e语句部分兼容。标准允许修改函数的更多属性，但不提供重命名函数、将函数设为安全性定义者、为函数附加配置参数值，或者更改函数的拥有者、模式或易变性的能力。标准还要求使用\u003ccode\u003eRESTRICT\u003c/code\u003e关键字，而它在 \u003cspan\u003ePostgreSQL\u003c/span\u003e中是可选的。\u003c/p\u003e\u003c/section\u003e\u003csection\u003e\u003ch2\u003e另见\u003c/h2\u003e\u003cspan\u003e\u003ca href=\"/wiki/sql/create-function/?v=18\" title=\"CREATE FUNCTION\" rel=\"nofollow\"\u003e\u003cspan\u003eCREATE FUNCTION\u003c/span\u003e\u003c/a\u003e, \u003ca href=\"/wiki/sql/drop-function/?v=18\" title=\"DROP FUNCTION\" rel=\"nofollow\"\u003e\u003cspan\u003eDROP FUNCTION\u003c/span\u003e\u003c/a\u003e, \u003ca href=\"/wiki/sql/alter-procedure/?v=18\" title=\"ALTER PROCEDURE\" rel=\"nofollow\"\u003e\u003cspan\u003eALTER PROCEDURE\u003c/span\u003e\u003c/a\u003e, \u003ca href=\"/wiki/sql/alter-routine/?v=18\" title=\"ALTER ROUTINE\" rel=\"nofollow\"\u003e\u003cspan\u003eALTER ROUTINE\u003c/span\u003e\u003c/a\u003e\u003c/span\u003e\u003c/section\u003e","SourceRevision":"1b5ca64c","ContentHash":"925c934087ced455cf1cef8460f933814b727d2aae73b7850a98c2b39074ac4d","Payload":{"purpose_zh":"更改函数的定义","sections":[{"html":"\u003cp\u003e\u003ccode class=\"command\"\u003eALTER FUNCTION\u003c/code\u003e更改函数的定义。\u003c/p\u003e\u003cp\u003e要使用\u003ccode class=\"command\"\u003eALTER FUNCTION\u003c/code\u003e，你必须拥有该函数。要更改函数的模式，你还必须在新模式上具有\u003ccode class=\"literal\"\u003eCREATE\u003c/code\u003e权限。要更改拥有者，你必须能够对新的拥有角色执行\u003ccode class=\"literal\"\u003eSET ROLE\u003c/code\u003e，并且该角色必须在函数所在模式上具有\u003ccode class=\"literal\"\u003eCREATE\u003c/code\u003e权限。（这些限制确保更改拥有者不会做出任何你无法通过删除并重新创建该函数来完成的事情。不过，超级用户仍然可以更改任何函数的所有权。）\u003c/p\u003e","key":"description","title":"描述"},{"html":"\u003cdiv class=\"variablelist\"\u003e\u003cdl class=\"variablelist\"\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003cem class=\"replaceable\"\u003e\u003ccode\u003ename\u003c/code\u003e\u003c/em\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e现有函数的名称（可以用模式限定）。如果没有指定参数列表，这个名称必须在其模式中唯一。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003cem class=\"replaceable\"\u003e\u003ccode\u003eargmode\u003c/code\u003e\u003c/em\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e参数的模式：\u003ccode class=\"literal\"\u003eIN\u003c/code\u003e、\u003ccode class=\"literal\"\u003eOUT\u003c/code\u003e、\u003ccode class=\"literal\"\u003eINOUT\u003c/code\u003e或\u003ccode class=\"literal\"\u003eVARIADIC\u003c/code\u003e。如果省略，默认为\u003ccode class=\"literal\"\u003eIN\u003c/code\u003e。注意\u003ccode class=\"command\"\u003eALTER FUNCTION\u003c/code\u003e 实际上并不关心任何\u003ccode class=\"literal\"\u003eOUT\u003c/code\u003e参数，因为确定函数身份只需要输入参数。因此，只列出\u003ccode class=\"literal\"\u003eIN\u003c/code\u003e、\u003ccode class=\"literal\"\u003eINOUT\u003c/code\u003e和\u003ccode class=\"literal\"\u003eVARIADIC\u003c/code\u003e参数就足够了。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003cem class=\"replaceable\"\u003e\u003ccode\u003eargname\u003c/code\u003e\u003c/em\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e参数的名称。注意\u003ccode class=\"command\"\u003eALTER FUNCTION\u003c/code\u003e实际上并不关心参数名，因为确定函数身份只需要参数数据类型。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003cem class=\"replaceable\"\u003e\u003ccode\u003eargtype\u003c/code\u003e\u003c/em\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e函数参数的数据类型（如果有，可以用模式限定）。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003cem class=\"replaceable\"\u003e\u003ccode\u003enew_name\u003c/code\u003e\u003c/em\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e该函数的新名称。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003cem class=\"replaceable\"\u003e\u003ccode\u003enew_owner\u003c/code\u003e\u003c/em\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e该函数的新拥有者。注意，如果该函数被标记为 \u003ccode class=\"literal\"\u003eSECURITY DEFINER\u003c/code\u003e，随后它将以新拥有者的身份执行。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003cem class=\"replaceable\"\u003e\u003ccode\u003enew_schema\u003c/code\u003e\u003c/em\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e该函数的新模式。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003ccode class=\"literal\"\u003eDEPENDS ON EXTENSION \u003cem class=\"replaceable\"\u003e\u003ccode\u003eextension_name\u003c/code\u003e\u003c/em\u003e\u003c/code\u003e\u003cbr\u003e\u003c/span\u003e\u003cspan class=\"term\"\u003e\u003ccode class=\"literal\"\u003eNO DEPENDS ON EXTENSION \u003cem class=\"replaceable\"\u003e\u003ccode\u003eextension_name\u003c/code\u003e\u003c/em\u003e\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e这种形式会将函数标记为依赖于该扩展；如果指定了\u003ccode class=\"literal\"\u003eNO\u003c/code\u003e，则表示不再依赖该扩展。被标记为依赖扩展的函数会在扩展被删除时一并删除，即使没有指定\u003ccode class=\"literal\"\u003eCASCADE\u003c/code\u003e也是如此。一个函数可以依赖多个扩展，其中任意一个扩展被删除时，该函数都会被删除。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003ccode class=\"literal\"\u003eCALLED ON NULL INPUT\u003c/code\u003e\u003cbr\u003e\u003c/span\u003e\u003cspan class=\"term\"\u003e\u003ccode class=\"literal\"\u003eRETURNS NULL ON NULL INPUT\u003c/code\u003e\u003cbr\u003e\u003c/span\u003e\u003cspan class=\"term\"\u003e\u003ccode class=\"literal\"\u003eSTRICT\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e\u003ccode class=\"literal\"\u003eCALLED ON NULL INPUT\u003c/code\u003e将该函数改为在其部分或全部参数为 null 时仍会被调用。\u003ccode class=\"literal\"\u003eRETURNS NULL ON NULL INPUT\u003c/code\u003e或 \u003ccode class=\"literal\"\u003eSTRICT\u003c/code\u003e将该函数改为只要任一参数为 null 就不调用，而是自动假定结果为 null。详见\u003ca href=\"/docs/18/sql-createfunction.html\" title=\"CREATE FUNCTION\"\u003e\u003cspan class=\"refentrytitle\"\u003eCREATE FUNCTION\u003c/span\u003e\u003c/a\u003e。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003ccode class=\"literal\"\u003eIMMUTABLE\u003c/code\u003e\u003cbr\u003e\u003c/span\u003e\u003cspan class=\"term\"\u003e\u003ccode class=\"literal\"\u003eSTABLE\u003c/code\u003e\u003cbr\u003e\u003c/span\u003e\u003cspan class=\"term\"\u003e\u003ccode class=\"literal\"\u003eVOLATILE\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e将该函数的易变性更改为指定的设置。详见\u003ca href=\"/docs/18/sql-createfunction.html\" title=\"CREATE FUNCTION\"\u003e\u003cspan class=\"refentrytitle\"\u003eCREATE FUNCTION\u003c/span\u003e\u003c/a\u003e。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003ccode class=\"literal\"\u003e[ \u003cspan class=\"optional\"\u003eEXTERNAL\u003c/span\u003e ] SECURITY INVOKER\u003c/code\u003e\u003cbr\u003e\u003c/span\u003e\u003cspan class=\"term\"\u003e\u003ccode class=\"literal\"\u003e[ \u003cspan class=\"optional\"\u003eEXTERNAL\u003c/span\u003e ] SECURITY DEFINER\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e更改该函数是否为安全性定义者。关键字\u003ccode class=\"literal\"\u003eEXTERNAL\u003c/code\u003e 为了符合 SQL 标准而被忽略。关于这一能力的更多信息，参见\u003ca href=\"/docs/18/sql-createfunction.html\" title=\"CREATE FUNCTION\"\u003e\u003cspan class=\"refentrytitle\"\u003eCREATE FUNCTION\u003c/span\u003e\u003c/a\u003e。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003ccode class=\"literal\"\u003ePARALLEL\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e更改该函数是否被视为对并行执行安全。详见\u003ca href=\"/docs/18/sql-createfunction.html\" title=\"CREATE FUNCTION\"\u003e\u003cspan class=\"refentrytitle\"\u003eCREATE FUNCTION\u003c/span\u003e\u003c/a\u003e。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003ccode class=\"literal\"\u003eLEAKPROOF\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e更改该函数是否被视为防泄漏的。关于这一能力的更多信息，参见\u003ca href=\"/docs/18/sql-createfunction.html\" title=\"CREATE FUNCTION\"\u003e\u003cspan class=\"refentrytitle\"\u003eCREATE FUNCTION\u003c/span\u003e\u003c/a\u003e。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003ccode class=\"literal\"\u003eCOST\u003c/code\u003e \u003cem class=\"replaceable\"\u003e\u003ccode\u003eexecution_cost\u003c/code\u003e\u003c/em\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e更改该函数的估计执行代价。详见\u003ca href=\"/docs/18/sql-createfunction.html\" title=\"CREATE FUNCTION\"\u003e\u003cspan class=\"refentrytitle\"\u003eCREATE FUNCTION\u003c/span\u003e\u003c/a\u003e。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003ccode class=\"literal\"\u003eROWS\u003c/code\u003e \u003cem class=\"replaceable\"\u003e\u003ccode\u003eresult_rows\u003c/code\u003e\u003c/em\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e更改集合返回函数估计返回的行数。详见\u003ca href=\"/docs/18/sql-createfunction.html\" title=\"CREATE FUNCTION\"\u003e\u003cspan class=\"refentrytitle\"\u003eCREATE FUNCTION\u003c/span\u003e\u003c/a\u003e。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003ccode class=\"literal\"\u003eSUPPORT\u003c/code\u003e \u003cem class=\"replaceable\"\u003e\u003ccode\u003esupport_function\u003c/code\u003e\u003c/em\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e设置或更改该函数要使用的规划器支持函数。详见\u003ca href=\"/docs/18/xfunc-optimization.html\" title=\"36.11. 函数优化信息\"\u003e第 36.11 节\u003c/a\u003e。你必须是超级用户才能使用此选项。\u003c/p\u003e\u003cp\u003e此选项不能用于完全删除支持函数，因为它必须指定一个新的支持函数。如果需要这样做，请使用\u003ccode class=\"command\"\u003eCREATE OR REPLACE FUNCTION\u003c/code\u003e。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003cem class=\"replaceable\"\u003e\u003ccode\u003econfiguration_parameter\u003c/code\u003e\u003c/em\u003e\u003cbr\u003e\u003c/span\u003e\u003cspan class=\"term\"\u003e\u003cem class=\"replaceable\"\u003e\u003ccode\u003evalue\u003c/code\u003e\u003c/em\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e添加或更改在调用该函数时要赋给某个配置参数的值。如果 \u003cem class=\"replaceable\"\u003e\u003ccode\u003evalue\u003c/code\u003e\u003c/em\u003e是\u003ccode class=\"literal\"\u003eDEFAULT\u003c/code\u003e，或者等效地使用了\u003ccode class=\"literal\"\u003eRESET\u003c/code\u003e，则会移除函数局部设置，这样该函数就会使用其环境中现有的值执行。使用\u003ccode class=\"literal\"\u003eRESET ALL\u003c/code\u003e 可以清除所有函数局部设置。\u003ccode class=\"literal\"\u003eSET FROM CURRENT\u003c/code\u003e 会把执行\u003ccode class=\"command\"\u003eALTER FUNCTION\u003c/code\u003e时该参数的当前值保存为进入函数时要应用的值。\u003c/p\u003e\u003cp\u003e关于允许的参数名和值的更多信息，参见\u003ca href=\"/docs/18/sql-set.html\" title=\"SET\"\u003e\u003cspan class=\"refentrytitle\"\u003eSET\u003c/span\u003e\u003c/a\u003e和\u003ca href=\"/docs/18/runtime-config.html\" title=\"第 19 章 服务器配置\"\u003e第 19 章\u003c/a\u003e。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003ccode class=\"literal\"\u003eRESTRICT\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e为符合 SQL 标准而被忽略。\u003c/p\u003e\u003c/dd\u003e\u003c/dl\u003e\u003c/div\u003e","key":"parameters","title":"参数"},{"html":"\u003cp\u003e要将类型\u003ccode class=\"type\"\u003einteger\u003c/code\u003e的函数\u003ccode class=\"literal\"\u003esqrt\u003c/code\u003e 重命名为\u003ccode class=\"literal\"\u003esquare_root\u003c/code\u003e：\u003c/p\u003e\u003cpre class=\"programlisting\"\u003eALTER FUNCTION sqrt(integer) RENAME TO square_root;\n\u003c/pre\u003e\u003cp\u003e要将类型\u003ccode class=\"type\"\u003einteger\u003c/code\u003e的函数\u003ccode class=\"literal\"\u003esqrt\u003c/code\u003e 的拥有者改为\u003ccode class=\"literal\"\u003ejoe\u003c/code\u003e：\u003c/p\u003e\u003cpre class=\"programlisting\"\u003eALTER FUNCTION sqrt(integer) OWNER TO joe;\n\u003c/pre\u003e\u003cp\u003e要将类型\u003ccode class=\"type\"\u003einteger\u003c/code\u003e的函数\u003ccode class=\"literal\"\u003esqrt\u003c/code\u003e 的模式改为\u003ccode class=\"literal\"\u003emaths\u003c/code\u003e：\u003c/p\u003e\u003cpre class=\"programlisting\"\u003eALTER FUNCTION sqrt(integer) SET SCHEMA maths;\n\u003c/pre\u003e\u003cp\u003e要将类型\u003ccode class=\"type\"\u003einteger\u003c/code\u003e的函数\u003ccode class=\"literal\"\u003esqrt\u003c/code\u003e 标记为依赖于扩展\u003ccode class=\"literal\"\u003emathlib\u003c/code\u003e：\u003c/p\u003e\u003cpre class=\"programlisting\"\u003eALTER FUNCTION sqrt(integer) DEPENDS ON EXTENSION mathlib;\n\u003c/pre\u003e\u003cp\u003e要调整自动为函数设置的搜索路径：\u003c/p\u003e\u003cpre class=\"programlisting\"\u003eALTER FUNCTION check_password(text) SET search_path = admin, pg_temp;\n\u003c/pre\u003e\u003cp\u003e要禁用为函数自动设置\u003ccode class=\"varname\"\u003esearch_path\u003c/code\u003e：\u003c/p\u003e\u003cpre class=\"programlisting\"\u003eALTER FUNCTION check_password(text) RESET search_path;\n\u003c/pre\u003e\u003cp\u003e现在该函数将使用其调用者所使用的搜索路径执行。\u003c/p\u003e","key":"examples","title":"示例"},{"html":"\u003cp\u003e该语句与 SQL 标准中的\u003ccode class=\"command\"\u003eALTER FUNCTION\u003c/code\u003e语句部分兼容。标准允许修改函数的更多属性，但不提供重命名函数、将函数设为安全性定义者、为函数附加配置参数值，或者更改函数的拥有者、模式或易变性的能力。标准还要求使用\u003ccode class=\"literal\"\u003eRESTRICT\u003c/code\u003e关键字，而它在 \u003cspan class=\"productname\"\u003ePostgreSQL\u003c/span\u003e中是可选的。\u003c/p\u003e","key":"compatibility","title":"兼容性"},{"html":"\u003cspan class=\"simplelist\"\u003e\u003ca href=\"/wiki/sql/create-function/?v=18\" title=\"CREATE FUNCTION\"\u003e\u003cspan class=\"refentrytitle\"\u003eCREATE FUNCTION\u003c/span\u003e\u003c/a\u003e, \u003ca href=\"/wiki/sql/drop-function/?v=18\" title=\"DROP FUNCTION\"\u003e\u003cspan class=\"refentrytitle\"\u003eDROP FUNCTION\u003c/span\u003e\u003c/a\u003e, \u003ca href=\"/wiki/sql/alter-procedure/?v=18\" title=\"ALTER PROCEDURE\"\u003e\u003cspan class=\"refentrytitle\"\u003eALTER PROCEDURE\u003c/span\u003e\u003c/a\u003e, \u003ca href=\"/wiki/sql/alter-routine/?v=18\" title=\"ALTER ROUTINE\"\u003e\u003cspan class=\"refentrytitle\"\u003eALTER ROUTINE\u003c/span\u003e\u003c/a\u003e\u003c/span\u003e","key":"see_also","title":"另见"}],"sections_same_as":"","synopsis_html":"ALTER FUNCTION \u003cem class=\"replaceable\"\u003e\u003ccode\u003ename\u003c/code\u003e\u003c/em\u003e [ ( [ [ \u003cem class=\"replaceable\"\u003e\u003ccode\u003eargmode\u003c/code\u003e\u003c/em\u003e ] [ \u003cem class=\"replaceable\"\u003e\u003ccode\u003eargname\u003c/code\u003e\u003c/em\u003e ] \u003cem class=\"replaceable\"\u003e\u003ccode\u003eargtype\u003c/code\u003e\u003c/em\u003e [, ...] ] ) ]\n    \u003cem class=\"replaceable\"\u003e\u003ccode\u003eaction\u003c/code\u003e\u003c/em\u003e [ ... ] [ RESTRICT ]\nALTER FUNCTION \u003cem class=\"replaceable\"\u003e\u003ccode\u003ename\u003c/code\u003e\u003c/em\u003e [ ( [ [ \u003cem class=\"replaceable\"\u003e\u003ccode\u003eargmode\u003c/code\u003e\u003c/em\u003e ] [ \u003cem class=\"replaceable\"\u003e\u003ccode\u003eargname\u003c/code\u003e\u003c/em\u003e ] \u003cem class=\"replaceable\"\u003e\u003ccode\u003eargtype\u003c/code\u003e\u003c/em\u003e [, ...] ] ) ]\n    RENAME TO \u003cem class=\"replaceable\"\u003e\u003ccode\u003enew_name\u003c/code\u003e\u003c/em\u003e\nALTER FUNCTION \u003cem class=\"replaceable\"\u003e\u003ccode\u003ename\u003c/code\u003e\u003c/em\u003e [ ( [ [ \u003cem class=\"replaceable\"\u003e\u003ccode\u003eargmode\u003c/code\u003e\u003c/em\u003e ] [ \u003cem class=\"replaceable\"\u003e\u003ccode\u003eargname\u003c/code\u003e\u003c/em\u003e ] \u003cem class=\"replaceable\"\u003e\u003ccode\u003eargtype\u003c/code\u003e\u003c/em\u003e [, ...] ] ) ]\n    OWNER TO { \u003cem class=\"replaceable\"\u003e\u003ccode\u003enew_owner\u003c/code\u003e\u003c/em\u003e | CURRENT_ROLE | CURRENT_USER | SESSION_USER }\nALTER FUNCTION \u003cem class=\"replaceable\"\u003e\u003ccode\u003ename\u003c/code\u003e\u003c/em\u003e [ ( [ [ \u003cem class=\"replaceable\"\u003e\u003ccode\u003eargmode\u003c/code\u003e\u003c/em\u003e ] [ \u003cem class=\"replaceable\"\u003e\u003ccode\u003eargname\u003c/code\u003e\u003c/em\u003e ] \u003cem class=\"replaceable\"\u003e\u003ccode\u003eargtype\u003c/code\u003e\u003c/em\u003e [, ...] ] ) ]\n    SET SCHEMA \u003cem class=\"replaceable\"\u003e\u003ccode\u003enew_schema\u003c/code\u003e\u003c/em\u003e\nALTER FUNCTION \u003cem class=\"replaceable\"\u003e\u003ccode\u003ename\u003c/code\u003e\u003c/em\u003e [ ( [ [ \u003cem class=\"replaceable\"\u003e\u003ccode\u003eargmode\u003c/code\u003e\u003c/em\u003e ] [ \u003cem class=\"replaceable\"\u003e\u003ccode\u003eargname\u003c/code\u003e\u003c/em\u003e ] \u003cem class=\"replaceable\"\u003e\u003ccode\u003eargtype\u003c/code\u003e\u003c/em\u003e [, ...] ] ) ]\n    [ NO ] DEPENDS ON EXTENSION \u003cem class=\"replaceable\"\u003e\u003ccode\u003eextension_name\u003c/code\u003e\u003c/em\u003e\n\n\u003cspan class=\"phrase\"\u003e其中 \u003cem class=\"replaceable\"\u003e\u003ccode\u003eaction\u003c/code\u003e\u003c/em\u003e 是以下之一：\u003c/span\u003e\n\n    CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT\n    IMMUTABLE | STABLE | VOLATILE\n    [ NOT ] LEAKPROOF\n    [ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER\n    PARALLEL { UNSAFE | RESTRICTED | SAFE }\n    COST \u003cem class=\"replaceable\"\u003e\u003ccode\u003eexecution_cost\u003c/code\u003e\u003c/em\u003e\n    ROWS \u003cem class=\"replaceable\"\u003e\u003ccode\u003eresult_rows\u003c/code\u003e\u003c/em\u003e\n    SUPPORT \u003cem class=\"replaceable\"\u003e\u003ccode\u003esupport_function\u003c/code\u003e\u003c/em\u003e\n    SET \u003cem class=\"replaceable\"\u003e\u003ccode\u003econfiguration_parameter\u003c/code\u003e\u003c/em\u003e { TO | = } { \u003cem class=\"replaceable\"\u003e\u003ccode\u003evalue\u003c/code\u003e\u003c/em\u003e | DEFAULT }\n    SET \u003cem class=\"replaceable\"\u003e\u003ccode\u003econfiguration_parameter\u003c/code\u003e\u003c/em\u003e FROM CURRENT\n    RESET \u003cem class=\"replaceable\"\u003e\u003ccode\u003econfiguration_parameter\u003c/code\u003e\u003c/em\u003e\n    RESET ALL","synopsis_text":"ALTER FUNCTION name [ ( [ [ argmode ] [ argname ] argtype [, ...] ] ) ]\naction [ ... ] [ RESTRICT ]\nALTER FUNCTION name [ ( [ [ argmode ] [ argname ] argtype [, ...] ] ) ]\nRENAME TO new_name\nALTER FUNCTION name [ ( [ [ argmode ] [ argname ] argtype [, ...] ] ) ]\nOWNER TO { new_owner | CURRENT_ROLE | CURRENT_USER | SESSION_USER }\nALTER FUNCTION name [ ( [ [ argmode ] [ argname ] argtype [, ...] ] ) ]\nSET SCHEMA new_schema\nALTER FUNCTION name [ ( [ [ argmode ] [ argname ] argtype [, ...] ] ) ]\n[ NO ] DEPENDS ON EXTENSION extension_name\n其中 action 是以下之一：\n\nCALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT\nIMMUTABLE | STABLE | VOLATILE\n[ NOT ] LEAKPROOF\n[ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER\nPARALLEL { UNSAFE | RESTRICTED | SAFE }\nCOST execution_cost\nROWS result_rows\nSUPPORT support_function\nSET configuration_parameter { TO | = } { value | DEFAULT }\nSET configuration_parameter FROM CURRENT\nRESET configuration_parameter\nRESET ALL"}},"RequestedLocale":"zh-Hans","Fallback":false,"Versions":["10","11","12","13","14","15","16","17","18","19","20","7.4","8.0","8.1","8.2","8.3","8.4","9.0","9.1","9.2","9.3","9.4","9.5","9.6"],"Locales":["en","zh-Hans"],"Signatures":null,"Spellings":null,"SQLState":null,"Evidence":null}
