Tengo que escribir un script de implementación que funcione si existe o no existe un procedimiento almacenado. es decir, si existe, entonces necesito alterarlo, de lo contrario crearlo.
¿Cómo puedo hacer esto en el sql?
Estoy usando SQL Server 2005
sql
sql-server-2005
stored-procedures
GordyII
fuente
fuente
Respuestas:
Si DROP y CREATE el procedimiento, perderá la configuración de seguridad. Esto podría molestar a su DBA o romper su aplicación por completo.
Lo que hago es crear un procedimiento almacenado trivial si aún no existe. Después de eso, puede ALTERAR el procedimiento almacenado a su gusto.
De esta manera, la configuración de seguridad, los comentarios y otros meta deta sobrevivirán a la implementación.
fuente
if object_id('YourSp') is null BEGIN ... END
para agregar los permisos adecuados después de crear el procedimiento almacenado.La forma más limpia es probar su existencia, descartarla si existe y luego recrearla. No puede incrustar una declaración "create proc" dentro de una declaración IF. Esto debería funcionar bien:
fuente
Si solo se trata de procedimientos almacenados, lo más fácil es probablemente abandonar el proceso y luego volver a crearlo. Puede generar todo el código para hacerlo utilizando el asistente Generar secuencias de comandos en SQL Server.
fuente
Desde
SQL Server 2016 CTP3
usted puede usar nuevas declaraciones DIE en lugar de grandesIF
envoltoriosSintaxis:
Consulta:
Más información aquí.
fuente
donde
xxx
esta el nombre del procesofuente
Además de lo que ya se ha dicho, también me gusta agregar un enfoque diferente y abogar por el uso de una estrategia de implementación de script diferencial. En lugar de crear una secuencia de comandos con estado que siempre verifique el estado actual y actúe en función de ese estado, implemente a través de una serie de secuencias de comandos sin estado que se actualicen desde versiones conocidas . He usado esta estrategia y vale mucho la pena ya que mis scripts de implementación ahora están libres de 'IF'.
fuente
Puede escribir una consulta de la siguiente manera:
Para ser más específico sobre la sintaxis anterior:
OBJECT_ID es un número de identificación único para un objeto dentro de la base de datos, SQL Server lo utiliza internamente. Dado que estamos pasando ProcedureName seguido de su tipo de objeto P, que le dice al SQL Server que debe encontrar el objeto llamado ProcedureName, que es de tipo procedimiento, es decir, P
Esta consulta encontrará el procedimiento y, si está disponible, lo descartará y creará uno nuevo.
Para obtener información detallada sobre OBJECT_ID y los tipos de objetos, visite: SYS.Objects
fuente
fuente
Tengo un proceso almacenado que permite al cliente extender la validación, si existe no quiero cambiarlo, si no es así, quiero crearlo, la mejor manera que he encontrado:
fuente
El siguiente código verificará si el procedimiento almacenado ya existe o no.
Si existe, se alterará, si no existe, creará un nuevo procedimiento almacenado para usted:
fuente
Una mejor opción podría ser usar una herramienta como Red-Gate SQL Compare o SQL Examiner para comparar automáticamente las diferencias y generar un script de migración.
fuente