Đỉnh NGUYỄN

life's a journey not a destination


Leave a comment

[What’s New] – SQL Server 2012 – Những điểm mới trong cài đặt


SQL Server 2012 giới thiệu môt số sự thay đổi trong cài đặt:

1. Datacenter Edition: Datacenter edition được giới thiệu trong SQL Server 2008 R2 và không còn tồn tại trong SQL Server 2012. Thông tin về các phiên bản của SQL Server, xem Editions and Components of SQL Server 2012.

2. Business Intelligence edition: SQL Server 2012 giới thiệu 1 phiên bản mới của SQL Server – SQL Server Business Intelligence.

SQL Server 2012 Business Intelligence edition cung cấp nền tảng toàn diện để xây dựng các giải pháp BI dễ quản lý, khả năng mở rộng và bảo mật. Thêm thông tin, xem Features Supported by the Editions of SQL Server 2012.

3. Enterprise Edition: bắt đầu từ SQL Server 2012, có 2 phiên bản Enterprise khác nhau dựa trên bản quyền:

   – Enterprise Edition: Server/License Access License (CAL) based licensing

   – Enterprise Edition: Core-base Licensing

Thêm thông tin về các giới hạn của SQL Server, xem Compute Capacity Limits by Edition of SQL Server.

4. Các thay đổi về HĐH: bắt đầu từ SQL Server 2012, SP 1 là yêu cầu tối thiểu dành cho Windows 7 và Windows Server 2008 R2. Thêm thông tin về các yêu cầu trên HĐH, xem Hardware and Software Requirements for Installing SQL Server 2012.

5. Data Quality Services: bây giờ có thể cài Data Quality Services (DQS) trong khi cài SQL Server. Thêm thông tin, xem Install Data Quality Services.

6. Product Update: Product Update là đặc tính mới trong cài đặt SQL Server 2012. Nó sẽ cập nhật mới nhất cho sản phẩm cài đặt chính. Thêm thông tin, xem Product Updates in SQL Server 2012 Installation.

7. Server Core Installation: bắt đầu từ SQL Server 2012, chúng ta có thể cài SQL Server trên Windows Server 2008 R2 Server Core SP1. Thêm thông tin, xem  Install SQL Server 2012 Server Core.

8. SQL Server Data Tools (còn được gọi là Business Intelligence Development Studio): bắt đầu từ SQL Server 2012, bạn có thể cài đặt SQL Server Data Tools (SSDT) cung cấp IDE để xây dựng các giải pháp cho Business Inteligence: Analysis Services, Reporting Services, và Integration Services.

SSDT cũng gồm “Database Projects”, cung cấp môi trường tích hợp cho người phát triển CSDL có thể làm các công việc thiết kế cho nền tảng SQL Server dùng Visual Studio.

9. SQL Server multi-subnet clustering: bây giờ bạn có thể cấu hình SQL Server failover cluster dùng các node khác subnet. Thêm thông tin, xem SQL Server Multi-Subnet Clustering.

10. SMB file share is a supported storage option: các database hệ thống (master, model, msdb, và tempdb), và database người dùng Database Engine có thể được cài đặt trên trên máy chủ chia sẽ tập tin SMB. Điều này áp dụng cho cài đặt SQL Server stand-alone và SQL Server failover cluster. Thêm thông tin, xem Install SQL Server with SMB file share as a storage option.

Important: Tài khoản cài đặt SQL Server phải có FULL CONTROL và quyền NTFS trên SMB share folders. SQL Server service account và SQL Server agent service account phải có quyền FULL CONTROL trên SMB share folders.

Cùng 1 số thay đổi khác mình chưa quan tâm.

Advertisements


Leave a comment

System Stored Procedures trong SQL Server bạn nên biết


Các System Stored Procedures hữu ích khi thực hiện các hành động quản trị và xem thông tin các đốI tượng trong SQL Server. Sau đây là một số System Stored Procedures được dùng khá thường xuyên (không theo thứ tự ưu tiên):

System Stored Procedures Mô tả
sp_help Xem thông tin các đối tượng cơ sở dữ liệu (table, view, stored proc,… ), kiễu dữ liệu.
sp_helpdb Xem thông tin về 1 database hoặc tất cả databases.
sp_helptext Xem thông tin định nghĩa các rule, default, T-SQL stored procedure không mã hóa, T-SQL function, trigger, view,…)
sp_helpfile Xem tên database vật lý và thuộc tính của các tập tin liên quan đến database hiện tại. Dùng stored procedure này để xác định tên vật lý của database cần detach hoặc attach.
sp_spaceused Xem không gian đĩa được sử dụng bởI table, indexed view hoặc Service Broker queue trong database hiện tại.
sp_who Xem thông tin user, session, process hiện tại trong instance hiện tại của MS SQL Server Database Engine
sp_lock Xem thông tin về lock. Stored procedure này sẽ bị loại bỏ trong phiên bản sau của SQL Server. Dùng view sys.dm_tran_locks thay thế.
sp_configure Xem hoặc thay đổI các thiết lập cấu hình toàn cục trên database hiện tại.
sp_tables Xem danh sách các đối tượng có thể truy vấn trong database hiện tại. Tất cả các đối tượng trong mệnh đề FROM, trừ các đối tượng synonym.
sp_columns Xem thông tin các cột trong 1 table hoặc view
sp_depends Xem sự phụ thuộc các đối tượng trong database, như view và procedure phụ thuộc vào table hoặc view. Sự phụ thuộc vào các đốI tượng bên ngoài database hiện tại không được xét.

Trên đây chỉ là 1 số System Stored Procedures tôi thường dùng, nếu bạn thường dùng các System Stored Procedures mà không được liệt kê ở đây, vui lòng chia sẽ thông qua comment.


Leave a comment

Decrypt store proc trong MS SQL Server


Trên mạng có rất nhiều tools và mã hỗ trợ decrypt store proc trong MS SQL Server 2005, mình thử và thấy đoạn mã này hoạt động cũng ok

1. Login vào MS SQL Server Management Studio 2005 với quyền đặc biệt gọi là Dedicated Administrator Connection

Trên thanh công cụ, các bạn chọn biểu tượng Database Engine Query (nằm sát bên phải biểu tượng có chữ “New Query”)

Tại cửa sổ đăng nhập, thêm ADMIN: phía trước tên server (ví dụ: ADMIN:TFSSVR\MSSQL05) và đăng nhập theo cách thông thường

Vì login theo cách này thì không thể chọn hoặc nhìn thấy các database có trong MS SQL, nên phải dùng lệnh use để chuyển đến database chứa các store proc cần decrypt (ví dụ: use Northwind)

Và tạo store proc sau

2. Tạo Store Proc

/****** Object:  StoredProcedure [dbo].[sp_SQLDecrypt]    Script Date: 09/04/2009 23:04:01 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE procedure [dbo].[sp_SQLDecrypt]
@ObjectOwnerOrSchema NVARCHAR(128) = 'dbo',
@ObjectName NVARCHAR(128)
AS BEGIN

DECLARE @i INT
DECLARE @ObjectDataLength INT
DECLARE @ContentOfEncryptedObject NVARCHAR(MAX)
DECLARE @ContentOfDecryptedObject NVARCHAR(MAX)
DECLARE @ContentOfFakeObject NVARCHAR(MAX)
DECLARE @ContentOfFakeEncryptedObject NVARCHAR(MAX)
DECLARE @ObjectType NVARCHAR(128)
DECLARE @ObjectID INT
DECLARE @CmdText NVARCHAR(MAX)
SET NOCOUNT ON

SET @ObjectID = OBJECT_ID('[' + @ObjectOwnerOrSchema + '].[' + @ObjectName + ']')

-- Check that the provided object exists in the database.
IF @ObjectID IS NULL
BEGIN
RAISERROR('The object name or schema provided does not exist in the database', 16, 1)
RETURN
END

-- Check that the provided object is encrypted.
IF NOT EXISTS(SELECT TOP 1 * FROM syscomments WHERE id = @ObjectID AND encrypted = 1)
BEGIN
RAISERROR('The object provided exists however it is not encrypted. Aborting.', 16, 1)
RETURN
END

-- Determine the type of the object
IF OBJECT_ID('[' + @ObjectOwnerOrSchema + '].[' + @ObjectName + ']', 'PROCEDURE') IS NOT NULL
SET @ObjectType = 'PROCEDURE'
ELSE
IF OBJECT_ID('[' + @ObjectOwnerOrSchema + '].[' + @ObjectName + ']', 'TRIGGER') IS NOT NULL
SET @ObjectType = 'TRIGGER'
ELSE
IF OBJECT_ID('[' + @ObjectOwnerOrSchema + '].[' + @ObjectName + ']', 'VIEW') IS NOT NULL
SET @ObjectType = 'VIEW'
ELSE
SET @ObjectType = 'FUNCTION'

-- Get the binary representation of the object- syscomments no longer holds
-- the content of encrypted object.
SELECT TOP 1 @ContentOfEncryptedObject = imageval
FROM sys.sysobjvalues
WHERE objid = OBJECT_ID('[' + @ObjectOwnerOrSchema + '].[' + @ObjectName + ']')
AND valclass = 1 and subobjid = 1

SET @ObjectDataLength = DATALENGTH(@ContentOfEncryptedObject)/2
-- We need to alter the existing object and make it into a dummy object
-- in order to decrypt its content. This is done in a transaction
-- (which is later rolled back) to ensure that all changes have a minimal
-- impact on the database.
SET @ContentOfFakeObject = N'ALTER ' + @ObjectType + N' [' + @ObjectOwnerOrSchema + N'].[' + @ObjectName + N'] WITH ENCRYPTION AS'

WHILE DATALENGTH(@ContentOfFakeObject)/2 < @ObjectDataLength
BEGIN
IF DATALENGTH(@ContentOfFakeObject)/2 + 4000 < @ObjectDataLength
SET @ContentOfFakeObject = @ContentOfFakeObject + REPLICATE(N'-', 4000)
ELSE
SET @ContentOfFakeObject = @ContentOfFakeObject + REPLICATE(N'-', @ObjectDataLength - (DATALENGTH(@ContentOfFakeObject)/2))
END

-- Since we need to alter the object in order to decrypt it, this is done
-- in a transaction
SET XACT_ABORT OFF
BEGIN TRAN

EXEC(@ContentOfFakeObject)

IF @@ERROR <> 0
ROLLBACK TRAN

-- Get the encrypted content of the new "fake" object.
SELECT TOP 1 @ContentOfFakeEncryptedObject = imageval
FROM sys.sysobjvalues
WHERE objid = OBJECT_ID('[' + @ObjectOwnerOrSchema + '].[' + @ObjectName + ']')
AND valclass = 1 and subobjid = 1

IF @@TRANCOUNT > 0
ROLLBACK TRAN

-- Generate a CREATE script for the dummy object text.
SET @ContentOfFakeObject = N'CREATE ' + @ObjectType + N' [' + @ObjectOwnerOrSchema + N'].[' + @ObjectName + N'] WITH ENCRYPTION AS'

WHILE DATALENGTH(@ContentOfFakeObject)/2 < @ObjectDataLength
BEGIN
IF DATALENGTH(@ContentOfFakeObject)/2 + 4000 < @ObjectDataLength
SET @ContentOfFakeObject = @ContentOfFakeObject + REPLICATE(N'-', 4000)
ELSE
SET @ContentOfFakeObject = @ContentOfFakeObject + REPLICATE(N'-', @ObjectDataLength - (DATALENGTH(@ContentOfFakeObject)/2))
END

SET @i = 1

--Fill the variable that holds the decrypted data with a filler character
SET @ContentOfDecryptedObject = N''

WHILE DATALENGTH(@ContentOfDecryptedObject)/2 < @ObjectDataLength
BEGIN
IF DATALENGTH(@ContentOfDecryptedObject)/2 + 4000 < @ObjectDataLength
SET @ContentOfDecryptedObject = @ContentOfDecryptedObject + REPLICATE(N'A', 4000)
ELSE
SET @ContentOfDecryptedObject = @ContentOfDecryptedObject + REPLICATE(N'A', @ObjectDataLength - (DATALENGTH(@ContentOfDecryptedObject)/2))
END

WHILE @i <= @ObjectDataLength
BEGIN
--xor real & fake & fake encrypted
SET @ContentOfDecryptedObject = STUFF(@ContentOfDecryptedObject, @i, 1,
NCHAR(
UNICODE(SUBSTRING(@ContentOfEncryptedObject, @i, 1)) ^
(
UNICODE(SUBSTRING(@ContentOfFakeObject, @i, 1)) ^
UNICODE(SUBSTRING(@ContentOfFakeEncryptedObject, @i, 1))
)))

SET @i = @i + 1
END

-- PRINT the content of the decrypted object in chunks of 2K characters

SET @i = 0

WHILE DATALENGTH(@ContentOfDecryptedObject)/2 > (@i + 1)*2000
BEGIN
PRINT(SUBSTRING(@ContentOfDecryptedObject, 1 + 2000*@i, 2000*(@i + 1)))
SET @i = @i + 1
END

-- Now print the last chunk, or the only chunk
-- (if @ContentOfDecryptedObject does not exceed 2K characters)
SET @CmdText = 'DROP PROCEDURE ' + '[' + @ObjectOwnerOrSchema + '].[' + @ObjectName + ']'
EXEC (@CmdText)

-- PRINT(SUBSTRING(@ContentOfDecryptedObject, 1 + 2000*@i, 2000*(@i + 1)))
SET @CmdText = REPLACE(SUBSTRING(@ContentOfDecryptedObject, 1 + 2000*@i, 2000*(@i + 1)), 'WITH ENCRYPTION', '')
EXEC (@CmdText)
END

3. Dùng Store Proc trên để decrypt các store proc bị encrypted

Ví dụ: exec sp_SQLDecrypt ‘dbo’,’sp_StoreName’

Nhớ chú ý schema nha các bạn

Chúc vui!


Leave a comment

Automate SQL Server Express Backups


Tại nơi làm việc cũng như ở nhà, tôi thường dùng SQL Server Express 2005 để phát triển ứng dụng Web trước khi thật sự triển khai trên phiên bản cao hơn của SQL Server. Mọi thứ vẫn thuận lợi, nhưng SQL Server Express vẫn không thể hỗ trợ đầy đủ những gì tôi cần, như SQL Server Agent cho việc lập lịch tự động (jobs, scheduler) chẵn hạn.

May mắn thay, 1 website gọi là LazyCoding tạo ra 1 công cụ tuyệt vời (miễn phí) gọi là SQL Scheduler chạy như 1 dịch vụ nền và thực hiện công việc tự động được định sẵn thông qua giao diện. Cài đặt chỉ 3 bước và không thể đơn giản hơn.

 
 
Use Master

Declare @ToExecute VarChar(8000)

Select @ToExecute = ''

Select @ToExecute = Coalesce(@ToExecute + 'Backup Database ' + [Name] + ' To Disk = ''D:\Backups\Databases\' + [Name] + '.bak'' With Format;' + char(13),'')

From

Master..Sysdatabases

Where

[Name] Not In ('tempdb')

and databasepropertyex ([Name],'Status') = 'online'

Execute(@ToExecute)