PDA

View Full Version : اعمال تغییرات دیتابیس



sadaf_
چهارشنبه 18 دی 1392, 12:43 عصر
سلام
با چه روشی می تونم تغییرات دیتابیس را در سیستم های کاربران اعمال کنم
در صورتی که جدولی اضافه می شه و یا حذف می شه
و یا فیلدی اضافه و یا نوع آن تغییر می کنه
و ...
همه تغییراتی که در دیتابیس ها صورت می گیره را در کوئری باید چطوری بررسی کرد؟

Salah Sanjabian
چهارشنبه 18 دی 1392, 16:02 عصر
سلام شرکت RedGate یه مجموعه ابزار داره به اسم ToolBelt که میتونی ازش استفاده کنی. میتونی از Sql Packager که تو این مجموعه ابزار هستش استفاده کنی . Tools های دیگه ای هم هستش که خیلی کارا هستن.

benyaminrahimi
شنبه 21 دی 1392, 21:43 عصر
تکه کد های گرفتن اسکریپت مادر برای بروز رسانی --- برنامه بروز رسان سگال.. خواهشن فقط در صورت شیر در جای دیگه منبع ذکر بشه

جدول ها

IF EXISTS (SELECT * FROM tempdb.dbo.sysobjects WHERE id = object_id(N'[tempdb].[dbo].[#tblSQL]'))
DROP TABLE [dbo].[#tblSQL]

CREATE TABLE #tblSQL
(
sc VARCHAR(max) NOT NULL

)



INSERT INTO #tblSQL
(
sc
)



SELECT
'IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'+''''+'[dbo].[' +
so.name ++ ']'+''''+') AND type in (' + '''U'''
+ ')) begin create table [' + so.name + '] (' + o.list + ')' + CASE
WHEN
tc.Constraint_Name
IS
NULL THEN
''
ELSE
'ALTER TABLE ['
+
so.Name
+
'] ADD CONSTRAINT ['
+
tc.Constraint_Name
+
'] PRIMARY KEY '
+
' ('
+
LEFT(j.List, LEN(j.List) - 1)
+
') '

END+' end ' AS tbl_sc
FROM sysobjects so
CROSS APPLY
(
SELECT ' [' + column_name + '] ' +
data_type + CASE data_type
WHEN 'sql_variant' THEN ''

WHEN 'text' THEN ''
WHEN 'IMAGE' THEN ''
WHEN 'decimal' THEN '(' + CAST(numeric_precision_radix AS VARCHAR)
+ ', ' + CAST(numeric_scale AS VARCHAR) + ')'
ELSE COALESCE(
'(' + CASE
WHEN character_maximum_length =
-1 THEN 'MAX'
ELSE CAST(character_maximum_length AS VARCHAR)
END + ')',
''
)
END + ' ' +
CASE
WHEN EXISTS (
SELECT id
FROM syscolumns
WHERE OBJECT_NAME(id) = so.name
AND NAME = column_name
AND COLUMNPROPERTY(id, NAME, 'IsIdentity') = 1
) THEN 'IDENTITY(' +
CAST(IDENT_SEED(so.name) AS VARCHAR) + ',' +
CAST(IDENT_INCR(so.name) AS VARCHAR) + ')'
ELSE ''
END + ' ' + (CASE WHEN IS_NULLABLE = 'No' THEN 'NOT ' ELSE '' END) +
'NULL ' +
CASE
WHEN information_schema.columns.COLUMN_DEFAULT IS NOT NULL THEN
'DEFAULT ' + information_schema.columns.COLUMN_DEFAULT
ELSE ''
END + ', '
FROM information_schema.columns
WHERE table_name = so.name
ORDER BY
ordinal_position
FOR XML PATH('')
) o(list)
LEFT JOIN information_schema.table_constraints tc
ON tc.Table_name = so.Name
AND tc.Constraint_Type = 'PRIMARY KEY '
CROSS APPLY
(
SELECT '[' + Column_Name + '], '
FROM information_schema.key_column_usage kcu
WHERE kcu.Constraint_Name = tc.Constraint_Name
ORDER BY
ORDINAL_POSITION
FOR XML PATH('')
)


j(list)
WHERE xtype = 'U'
AND NAME NOT IN ('dtproperties')


SELECT * FROM #tblSQL


فیلدها

IF EXISTS (
SELECT *
FROM tempdb.dbo.sysobjects
WHERE id = OBJECT_ID(N'[tempdb].[dbo].[#fielder]')
)
DROP TABLE [dbo].#fielder

CREATE TABLE #fielder
(
sc VARCHAR(MAX) NOT NULL
)
DECLARE @IS_NULLABLE VARCHAR(50)
DECLARE @TABLE_NAME VARCHAR(1000)
DECLARE @COLUMN_NAME VARCHAR(1000)
DECLARE @DATA_TYPE VARCHAR(1000)
DECLARE @cmt VARCHAR(MAX)
DECLARE @befcmt VARCHAR(MAX)
DECLARE @elsecmt VARCHAR(MAX)
DECLARE @CHARACTER_MAXIMUM_LENGTH BIGINT
DECLARE @COLLATION_NAME VARCHAR(1000)

DECLARE filder CURSOR
FOR
SELECT IS_NULLABLE,
TABLE_NAME,
COLUMN_NAME,
DATA_TYPE,
CHARACTER_MAXIMUM_LENGTH,
COLLATION_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_name IN (SELECT NAME
FROM sys.Tables
WHERE NAME NOT IN ('sysdiagrams', 'dtproperties'))

OPEN filder
FETCH NEXT FROM filder INTO @IS_NULLABLE,@TABLE_NAME,@COLUMN_NAME,@DATA_TYPE,@ CHARACTER_MAXIMUM_LENGTH ,
@COLLATION_NAME
WHILE @@FETCH_STATUS = 0
BEGIN
IF @IS_NULLABLE = 'YES'
SET @IS_NULLABLE = ' null '

IF @IS_NULLABLE = 'NO'
SET @IS_NULLABLE = ' not null '

SET @befcmt = 'IF not EXISTS( SELECT * FROM INFORMATION_SCHEMA.COLUMNS '
+ ' WHERE TABLE_NAME = ' + '''' + @TABLE_NAME + ''''
+ ' AND COLUMN_NAME = ' + '''' + @COLUMN_NAME + ''''
+ ') begin '


SET @cmt = ''
IF @DATA_TYPE = 'int'
OR @DATA_TYPE = 'bigint'
OR @DATA_TYPE = 'money'
OR @DATA_TYPE = 'float'
OR @DATA_TYPE = 'bit'
OR @DATA_TYPE = 'image'
OR @DATA_TYPE = 'smallint'
SET @cmt = ' alter table [' + @TABLE_NAME + '] add [' +
@COLUMN_NAME + '] ' + @DATA_TYPE + @IS_NULLABLE


IF @DATA_TYPE = 'varchar'
OR @DATA_TYPE = 'nvarchar'
SET @cmt = ' alter table [' + @TABLE_NAME + '] add [' +
@COLUMN_NAME + '] ' + @DATA_TYPE + '(' +
CAST(@CHARACTER_MAXIMUM_LENGTH AS VARCHAR(200)) + ') COLLATE ' +
@COLLATION_NAME + @IS_NULLABLE

IF @DATA_TYPE = 'uniqueidentifier'
SET @cmt = ' alter table [' + @TABLE_NAME + '] add [' +
@COLUMN_NAME +
'] uniqueidentifier not null rowguidcol unique default (newid())'



IF @DATA_TYPE = 'VARBINARY'
SET @cmt = 'if exists( SELECT * FROM sys.filegroups WHERE [name]=' +
'''' +
'filer' + '''' + ') '
+ ' alter table [' + @TABLE_NAME + '] add '
+ '[' + @COLUMN_NAME + '] ' + @DATA_TYPE + '(MAX) filestream ' + @IS_NULLABLE


SET @elsecmt=''

IF @DATA_TYPE = 'int'
OR @DATA_TYPE = 'bigint'
OR @DATA_TYPE = 'money'
OR @DATA_TYPE = 'float'
OR @DATA_TYPE = 'bit'
OR @DATA_TYPE = 'image'
OR @DATA_TYPE = 'smallint'
SET @elsecmt = ' end else begin alter table [' + @TABLE_NAME + '] ALTER COLUMN [' +
@COLUMN_NAME + '] ' + @DATA_TYPE + @IS_NULLABLE


IF @DATA_TYPE = 'varchar'
OR @DATA_TYPE = 'nvarchar'
SET @elsecmt = ' end else begin alter table [' + @TABLE_NAME + '] ALTER COLUMN [' +
@COLUMN_NAME + '] ' + @DATA_TYPE + '(' +
CAST(@CHARACTER_MAXIMUM_LENGTH AS VARCHAR(200)) + ') COLLATE ' +
@COLLATION_NAME + @IS_NULLABLE

SET @cmt=@cmt+@elsecmt
IF @cmt <> ''
INSERT INTO #fielder
(
sc
)
SELECT @befcmt + @cmt + ' end '

FETCH NEXT FROM filder INTO @IS_NULLABLE,@TABLE_NAME,@COLUMN_NAME,@DATA_TYPE,
@CHARACTER_MAXIMUM_LENGTH ,
@COLLATION_NAME
END
CLOSE filder
DEALLOCATE filder

SELECT *
FROM #fielder f