Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Создание процедуры  [new]
beaver06
Member

Откуда:
Сообщений: 681
Добрый день!
Можно ли как-то создать процедуры, в тексте которой будет: alter database, create procedure, create login, go и т.д.

Спасибо...
13 сен 13, 11:45    [14835647]     Ответить | Цитировать Сообщить модератору
 Re: Создание процедуры  [new]
Glory
Member

Откуда:
Сообщений: 104760
Можно. Создавайте
13 сен 13, 11:46    [14835662]     Ответить | Цитировать Сообщить модератору
 Re: Создание процедуры  [new]
Гость333
Member

Откуда:
Сообщений: 3683
use tempdb;
go
create procedure go
as
print 'Go go go!'
go
go;
go 10
drop procedure go;
go
13 сен 13, 11:53    [14835746]     Ответить | Цитировать Сообщить модератору
 Re: Создание процедуры  [new]
beaver06
Member

Откуда:
Сообщений: 681
Гость333,
Так работает:
IF NOT EXISTS (SELECT name FROM sys.databases WHERE name = N'dddd')
BEGIN
CREATE DATABASE [dddd]
CONTAINMENT = NONE
ON PRIMARY
( NAME = N'DS', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\fff.mdf' , SIZE = 17408KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB )
LOG ON
( NAME = N'DS_log', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\fff_log.ldf' , SIZE = 5184KB , MAXSIZE = 2048GB , FILEGROWTH = 10%)
END
GO
ALTER DATABASE [dddd] SET MULTI_USER
GO
ALTER DATABASE [dddd] SET PAGE_VERIFY CHECKSUM
GO
ALTER DATABASE [dddd] SET DB_CHAINING OFF



Если обернуть в create procedure sp_ddd
as
begin

end
не работает:

create procedure sp_ddd
as
begin

IF NOT EXISTS (SELECT name FROM sys.databases WHERE name = N'dddd')
BEGIN
CREATE DATABASE [dddd]
CONTAINMENT = NONE
ON PRIMARY
( NAME = N'DS', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\fff.mdf' , SIZE = 17408KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB )
LOG ON
( NAME = N'DS_log', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\fff_log.ldf' , SIZE = 5184KB , MAXSIZE = 2048GB , FILEGROWTH = 10%)
END
GO
ALTER DATABASE [dddd] SET MULTI_USER
GO
ALTER DATABASE [dddd] SET PAGE_VERIFY CHECKSUM
GO
ALTER DATABASE [dddd] SET DB_CHAINING OFF

end
13 сен 13, 12:02    [14835844]     Ответить | Цитировать Сообщить модератору
 Re: Создание процедуры  [new]
Glory
Member

Откуда:
Сообщений: 104760
GO не является командой TSQL
GO яляется разделителем пакетов в утилитах Microsoft
13 сен 13, 12:04    [14835868]     Ответить | Цитировать Сообщить модератору
 Re: Создание процедуры  [new]
beaver06
Member

Откуда:
Сообщений: 681
Glory,

т.е. GO - нельзя?

В педыдущем вашем посте вы написали, что можно:

автор
Добрый день!
Можно ли как-то создать процедуры, в тексте которой будет: alter database, create procedure, create login, go и т.д.

Спасибо...



Можно. Создавайте
13 сен 13, 12:06    [14835889]     Ответить | Цитировать Сообщить модератору
 Re: Создание процедуры  [new]
Glory
Member

Откуда:
Сообщений: 104760
beaver06
т.е. GO - нельзя?

В педыдущем вашем посте вы написали, что можно:

Я разве написал, что можно придумывать синтаксис или команды самому ?
13 сен 13, 12:09    [14835910]     Ответить | Цитировать Сообщить модератору
 Re: Создание процедуры  [new]
beaver06
Member

Откуда:
Сообщений: 681
Glory,

USE тоже нельзя использовать в тексте процедуры?
13 сен 13, 12:17    [14835971]     Ответить | Цитировать Сообщить модератору
 Re: Создание процедуры  [new]
Glory
Member

Откуда:
Сообщений: 104760
beaver06
USE тоже нельзя использовать в тексте процедуры?

Да что вы говорите
13 сен 13, 12:24    [14836011]     Ответить | Цитировать Сообщить модератору
 Re: Создание процедуры  [new]
beaver06
Member

Откуда:
Сообщений: 681
Glory,
USE master

Msg 154, Level 15, State 1, Procedure sp_ddd, Line 607
a USE database statement is not allowed in a procedure, function or trigger.
13 сен 13, 12:35    [14836071]     Ответить | Цитировать Сообщить модератору
 Re: Создание процедуры  [new]
Glory
Member

Откуда:
Сообщений: 104760
BOL - EXECUTE - Execute a character string
13 сен 13, 12:38    [14836087]     Ответить | Цитировать Сообщить модератору
 Re: Создание процедуры  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31432
beaver06
Добрый день!
Можно ли как-то создать процедуры, в тексте которой будет: alter database, create procedure, create login, go и т.д.

Спасибо...
Вы лучше напишите, что вам нужно сделать, и что не получается.

А то странный вопрос: "могут ли в тексте встречаться слова"... Конечно могут.
13 сен 13, 13:37    [14836508]     Ответить | Цитировать Сообщить модератору
 Re: Создание процедуры  [new]
beaver06
Member

Откуда:
Сообщений: 681
alexeyvg,

У меня есть sql файл с набором инструкций, его надо переделать в процедуру. Никак не получается его переделать.

выкладываю часть файла:

--Создание Базы
USE [master]
GO
/****** Object: Database [DBASE] Script Date: 13.05.2013 11:37:30 ******/
IF NOT EXISTS (SELECT name FROM sys.databases WHERE name = N'DBASE')
BEGIN
CREATE DATABASE [DBASE]
CONTAINMENT = NONE
ON PRIMARY
( NAME = N'DS', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\DS.mdf' , SIZE = 17408KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB )
LOG ON
( NAME = N'DS_log', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\DS_log.ldf' , SIZE = 5184KB , MAXSIZE = 2048GB , FILEGROWTH = 10%)
END

GO
ALTER DATABASE [DBASE] SET COMPATIBILITY_LEVEL = 110
GO
IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled'))
begin
EXEC [DBASE].[dbo].[sp_fulltext_database] @action = 'enable'
end
GO
ALTER DATABASE [DBASE] SET ANSI_NULL_DEFAULT OFF
GO
ALTER DATABASE [DBASE] SET ANSI_NULLS OFF
GO
ALTER DATABASE [DBASE] SET ANSI_PADDING OFF
GO
ALTER DATABASE [DBASE] SET ANSI_WARNINGS OFF
GO
ALTER DATABASE [DBASE] SET ARITHABORT OFF
GO
ALTER DATABASE [DBASE] SET AUTO_CLOSE OFF
GO
ALTER DATABASE [DBASE] SET AUTO_CREATE_STATISTICS ON
GO
ALTER DATABASE [DBASE] SET AUTO_SHRINK OFF
GO
ALTER DATABASE [DBASE] SET AUTO_UPDATE_STATISTICS ON
GO
ALTER DATABASE [DBASE] SET CURSOR_CLOSE_ON_COMMIT OFF
GO
ALTER DATABASE [DBASE] SET CURSOR_DEFAULT GLOBAL
GO
ALTER DATABASE [DBASE] SET CONCAT_NULL_YIELDS_NULL OFF
GO
ALTER DATABASE [DBASE] SET NUMERIC_ROUNDABORT OFF
GO
ALTER DATABASE [DBASE] SET QUOTED_IDENTIFIER OFF
GO
ALTER DATABASE [DBASE] SET RECURSIVE_TRIGGERS OFF
GO
ALTER DATABASE [DBASE] SET ENABLE_BROKER
GO
ALTER DATABASE [DBASE] SET AUTO_UPDATE_STATISTICS_ASYNC OFF
GO
ALTER DATABASE [DBASE] SET DATE_CORRELATION_OPTIMIZATION OFF
GO
ALTER DATABASE [DBASE] SET TRUSTWORTHY ON
GO
ALTER DATABASE [DBASE] SET ALLOW_SNAPSHOT_ISOLATION OFF
GO
ALTER DATABASE [DBASE] SET PARAMETERIZATION SIMPLE
GO
ALTER DATABASE [DBASE] SET READ_COMMITTED_SNAPSHOT OFF
GO
ALTER DATABASE [DBASE] SET HONOR_BROKER_PRIORITY OFF
GO
ALTER DATABASE [DBASE] SET RECOVERY SIMPLE
GO
ALTER DATABASE [DBASE] SET MULTI_USER
GO
ALTER DATABASE [DBASE] SET PAGE_VERIFY CHECKSUM
GO
ALTER DATABASE [DBASE] SET DB_CHAINING OFF
GO
ALTER DATABASE [DBASE] SET FILESTREAM( NON_TRANSACTED_ACCESS = OFF )
GO
ALTER DATABASE [DBASE] SET TARGET_RECOVERY_TIME = 0 SECONDS
GO
/****** Object: Login [NT SERVICE\Winmgmt] Script Date: 13.05.2013 11:37:31 ******/
IF NOT EXISTS (SELECT * FROM sys.server_principals WHERE name = N'NT SERVICE\Winmgmt')
CREATE LOGIN [NT SERVICE\Winmgmt] FROM WINDOWS WITH DEFAULT_DATABASE=[master], DEFAULT_LANGUAGE=[us_english]
GO
/****** Object: Login [NT SERVICE\SQLWriter] Script Date: 13.05.2013 11:37:31 ******/
IF NOT EXISTS (SELECT * FROM sys.server_principals WHERE name = N'NT SERVICE\SQLWriter')
CREATE LOGIN [NT SERVICE\SQLWriter] FROM WINDOWS WITH DEFAULT_DATABASE=[master], DEFAULT_LANGUAGE=[us_english]
GO
/****** Object: Login [NT SERVICE\MSSQLSERVER] Script Date: 13.05.2013 11:37:31 ******/
IF NOT EXISTS (SELECT * FROM sys.server_principals WHERE name = N'NT SERVICE\MSSQLSERVER')
CREATE LOGIN [NT SERVICE\MSSQLSERVER] FROM WINDOWS WITH DEFAULT_DATABASE=[master], DEFAULT_LANGUAGE=[us_english]
GO
/****** Object: Login [NT AUTHORITY\система] Script Date: 13.05.2013 11:37:31 ******/
IF NOT EXISTS (SELECT * FROM sys.server_principals WHERE name = N'NT AUTHORITY\система')
CREATE LOGIN [NT AUTHORITY\система] FROM WINDOWS WITH DEFAULT_DATABASE=[master], DEFAULT_LANGUAGE=[us_english]
GO


/****** Object: Login [BUILTIN\Пользователи] Script Date: 13.05.2013 11:37:31 ******/
IF NOT EXISTS (SELECT * FROM sys.server_principals WHERE name = N'BUILTIN\Пользователи')
CREATE LOGIN [BUILTIN\Пользователи] FROM WINDOWS WITH DEFAULT_DATABASE=[master], DEFAULT_LANGUAGE=[us_english]
GO
/* For security reasons the login is created disabled and with a random password. */
/****** Object: Login [user_service] Script Date: 13.05.2013 11:37:31 ******/
IF NOT EXISTS (SELECT * FROM sys.server_principals WHERE name = N'user_service')
CREATE LOGIN [user_service]
WITH PASSWORD=0x020016CF634F0A117C5E658A0112A3FAE520CA778F8F552D1302465ECDEC4D7F75075BF8C62857D94841EDAE4E00AAA211B1A760EE7E23EEE198430468BDF26A59D8450A0B6E HASHED,
DEFAULT_DATABASE=[master], DEFAULT_LANGUAGE=[us_english], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF
GO

/* For security reasons the login is created disabled and with a random password. */
/****** Object: Login [##MS_PolicyTsqlExecutionLogin##] Script Date: 13.05.2013 11:37:31 ******/


ALTER SERVER ROLE [sysadmin] ADD MEMBER [NT SERVICE\Winmgmt]
GO
ALTER SERVER ROLE [sysadmin] ADD MEMBER [NT SERVICE\SQLWriter]
GO
ALTER SERVER ROLE [sysadmin] ADD MEMBER [NT SERVICE\MSSQLSERVER]
G

USE [DBASE]
GO

/****** Object: User [user_service] Script Date: 13.05.2013 11:37:40 ******/
IF NOT EXISTS (SELECT * FROM sys.database_principals WHERE name = N'user_service')
CREATE USER [user_service] FOR LOGIN [user_service] WITH DEFAULT_SCHEMA=[user_service]
GO

GRANT CONNECT TO [user_service] AS [dbo]
GO

/****** Object: Schema [user_service] Script Date: 13.05.2013 11:37:41 ******/
IF NOT EXISTS (SELECT * FROM sys.schemas WHERE name = N'user_service')
EXEC sys.sp_executesql N'CREATE SCHEMA [user_service] AUTHORIZATION [user_service]'

GO
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[CreateMessage]') AND type in (N'P', N'PC'))
BEGIN
EXEC dbo.sp_executesql @statement = N'CREATE PROCEDURE [dbo].[CreateMessage]

@ID uniqueidentifier,
@MessageType nchar(6),
@StoreID nvarchar(9),
@XMLData xml,
@BinaryDataID uniqueidentifier
AS
BEGIN
SET NOCOUNT ON;

INSERT INTO [dbo].[MessageSend]
([ID]
,[MessageType]
,[StoreID]
,[CreateDate]
,[CreateUTCDate]
,[XMLData]
,[BinaryDataID])
VALUES
(@ID
,@MessageType
,@StoreID
,GETDATE()
,GETUTCDATE()
,@XMLData
,@BinaryDataID)
END
'
END
GO
ALTER AUTHORIZATION ON [dbo].[CreateMessage] TO SCHEMA OWNER
GO
GRANT EXECUTE ON [dbo].[CreateMessage] TO [user_service] AS [dbo]

USE [master]
GO
ALTER DATABASE [DBASE] SET READ_WRITE
GO

USE [DBASE]
GO
--Настройка Service Broker
ALTER DATABASE DBASE SET TRUSTWORTHY ON
go
alter database DBASE set enable_broker with rollback IMMEDIATE
GO
alter database DBASE set NEW_BROKER
GO
USE DBASE
go

--DROP MASTER KEY
--go
IF NOT EXISTS (SELECT * FROM sys.symmetric_keys WHERE symmetric_key_id = 101)
create master key encryption by password = 'Qwerty123'
GO
IF NOT EXISTS (SELECT * FROM sys.service_message_types where name='MessageCCM')
CREATE MESSAGE TYPE [MessageCCM] VALIDATION = WELL_FORMED_XML
GO

IF NOT EXISTS (SELECT * FROM sys.service_contracts where name='ContractCCM')
CREATE CONTRACT [ContractCCM] ([MessageCCM] SENT BY ANY)
GO

IF NOT EXISTS (SELECT * FROM sys.service_queues where name='QueueCCM')
CREATE QUEUE [dbo].[QueueCCM] WITH STATUS = ON , RETENTION = OFF , ACTIVATION ( STATUS = ON , PROCEDURE_NAME = [dbo].[sp_activateCCM] , MAX_QUEUE_READERS = 1 , EXECUTE AS OWNER ), POISON_MESSAGE_HANDLING (STATUS = ON) ON [PRIMARY]
GO


DECLARE @sql_service VARCHAR(500)
DECLARE @sql_service_grant VARCHAR(500)
IF NOT EXISTS (SELECT * FROM sys.services where name='ServiceCCM_'+LOWER(@@SERVERNAME))
begin
SET @sql_service = 'CREATE SERVICE [ServiceCCM_'+LOWER(@@SERVERNAME)+'] ON QUEUE [dbo].[QueueCCM] ([ContractCCM])'
EXEC (@sql_service)

SET @sql_service_grant ='GRANT SEND ON SERVICE::[ServiceCCM_'+LOWER(@@SERVERNAME)+'] TO [Public]'
EXEC (@sql_service_grant)
end

IF NOT EXISTS (SELECT * FROM sys.routes where name='server')
CREATE ROUTE [route_server] WITH SERVICE_NAME = N'ServiceCCM' ,
BROKER_INSTANCE = '9b71d878-7347-4c17-9ac6-a292985d932b', ADDRESS = N'TCP://server:4032'
GO

IF NOT EXISTS (SELECT * FROM sys.endpoints where name='BEndpoint')
CREATE ENDPOINT BEndpoint
STATE = STARTED
AS TCP ( LISTENER_PORT = 4032 )
FOR SERVICE_BROKER ( AUTHENTICATION = WINDOWS ) ;
GO
17 сен 13, 10:14    [14847672]     Ответить | Цитировать Сообщить модератору
 Re: Создание процедуры  [new]
Glory
Member

Откуда:
Сообщений: 104760
beaver06
У меня есть sql файл с набором инструкций, его надо переделать в процедуру. Никак не получается его переделать.

BOL - EXECUTE - Execute a character string

ЗЫ
Зачем переделывать в процедуру скрипт создания базы - непонятно

Сообщение было отредактировано: 17 сен 13, 10:21
17 сен 13, 10:20    [14847697]     Ответить | Цитировать Сообщить модератору
 Re: Создание процедуры  [new]
beaver06
Member

Откуда:
Сообщений: 681
Glory,

тогда вопрос:
если в любом месте файла происходит ошибка - рез-ты предыдущих успешно выполненных инструкций останутся, или будет откат всего?
Т.е. мне надо или все или ничего.

Спасибо...
17 сен 13, 10:24    [14847716]     Ответить | Цитировать Сообщить модератору
 Re: Создание процедуры  [new]
Гость333
Member

Откуда:
Сообщений: 3683
beaver06
мне надо или все или ничего

Вы считаете, что хранимая процедура обеспечивает "или все или ничего"?
17 сен 13, 10:31    [14847748]     Ответить | Цитировать Сообщить модератору
 Re: Создание процедуры  [new]
Glory
Member

Откуда:
Сообщений: 104760
beaver06
Т.е. мне надо или все или ничего.

Ваш скрипт и сейчас этого не обеспечивает.
С чего вдруг процедура что-то изменит
17 сен 13, 10:32    [14847757]     Ответить | Цитировать Сообщить модератору
 Re: Создание процедуры  [new]
beaver06
Member

Откуда:
Сообщений: 681
Glory,

подскажите, пожалуйста, как тогда обеспечить все или ничего?
Если это возможно? Как заставить выполнить откат в случае ошибок?
17 сен 13, 12:23    [14848628]     Ответить | Цитировать Сообщить модератору
 Re: Создание процедуры  [new]
Glory
Member

Откуда:
Сообщений: 104760
beaver06
подскажите, пожалуйста, как тогда обеспечить все или ничего?

Изучить
- что такое транзакции
- что такое обработка ошибок
Потом написать скрипт, в котором будет и первое и второе
17 сен 13, 12:25    [14848640]     Ответить | Цитировать Сообщить модератору
 Re: Создание процедуры  [new]
beaver06
Member

Откуда:
Сообщений: 681
Glory,

т.е в принципе реально засунуть такой скрипт в одну транзакцию, после некоторых переделок?
17 сен 13, 12:41    [14848748]     Ответить | Цитировать Сообщить модератору
 Re: Создание процедуры  [new]
Гость333
Member

Откуда:
Сообщений: 3683
beaver06
т.е в принципе реально засунуть такой скрипт в одну транзакцию, после некоторых переделок?

Команды CREATE DATABASE, ALTER DATABASE не могут быть выполнены в транзакции, открытой пользователем.
17 сен 13, 12:43    [14848767]     Ответить | Цитировать Сообщить модератору
 Re: Создание процедуры  [new]
beaver06
Member

Откуда:
Сообщений: 681
Гость333,
я это понимаю.

CREATE DATABASE statement not allowed within multi-statement transaction

А что-нибудь можно придумать?

У меня основная задача, если после создания базы происходят ошибки - удалить базу
17 сен 13, 12:46    [14848792]     Ответить | Цитировать Сообщить модератору
 Re: Создание процедуры  [new]
Glory
Member

Откуда:
Сообщений: 104760
beaver06
т.е в принципе реально засунуть такой скрипт в одну транзакцию, после некоторых переделок?

Я же написал - сначала "изучить". А не делать предположений.
Что такое транзакции, какие команды в них можно выполнять, а какие нельзя. Как обрабатывать ошибки. И тд
17 сен 13, 12:47    [14848800]     Ответить | Цитировать Сообщить модератору
 Re: Создание процедуры  [new]
Glory
Member

Откуда:
Сообщений: 104760
beaver06
А что-нибудь можно придумать?

Запустить скрипт вручную. Следить за его окончанием. В случае неудачи удалить все руками
17 сен 13, 12:49    [14848816]     Ответить | Цитировать Сообщить модератору
 Re: Создание процедуры  [new]
beaver06
Member

Откуда:
Сообщений: 681
Glory,

я его запускаю на большой куче SQL серверов с помощью SCCM. В принципе этот скрипт ни разу не сбойнул.
Но хочется обезопасить себя от ошибок.
17 сен 13, 13:02    [14848897]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить