DEV Community

Cover image for How To Use The SQL Server ALTER Keyword To Modify Database Objects
Amr Saafan for Nile Bits

Posted on • Originally published at nilebits.com

How To Use The SQL Server ALTER Keyword To Modify Database Objects

Introduction

The SQL Server ALTER keyword is a fundamental tool in a database administrator's toolkit, allowing for modifications to database objects without the need to drop and recreate them. This powerful command is versatile, enabling changes to tables, stored procedures, views, functions, triggers, and more. Understanding how to use the ALTER keyword effectively can significantly enhance your ability to manage and optimize your SQL Server databases.

We'll go deeply into the many applications of the ALTER keyword in this blog article, examining its syntax and offering several code samples to illustrate its power. This tutorial will help you with all your table-related needs, including updating stored procedures, changing data types, adding new columns, and modifying constraints. In order to make sure you're utilizing the ALTER keyword effectively and securely, we'll also include reference links for additional reading and best practices.

Understanding the Basics of SQL Server ALTER Keyword

The ALTER keyword is used to change the structure of existing database objects in SQL Server. It allows you to modify the definition of objects like tables, views, procedures, and functions without the need to drop and recreate them. This makes it a powerful tool for managing changes in a database environment.

Syntax of the ALTER Keyword

The basic syntax of the ALTER keyword varies depending on the object you're modifying. Here's a general overview:

Table:

  ALTER TABLE table_name
  ADD | DROP | ALTER COLUMN column_name data_type;
Enter fullscreen mode Exit fullscreen mode

View:

  ALTER VIEW view_name
  AS
  SELECT columns
  FROM table_name
  WHERE condition;
Enter fullscreen mode Exit fullscreen mode

Stored Procedure:

  ALTER PROCEDURE procedure_name
  AS
  BEGIN
      -- SQL statements
  END;
Enter fullscreen mode Exit fullscreen mode

Function:

  ALTER FUNCTION function_name
  RETURNS return_data_type
  AS
  BEGIN
      -- SQL statements
  END;
Enter fullscreen mode Exit fullscreen mode

Trigger:

  ALTER TRIGGER trigger_name
  ON table_name
  FOR INSERT, UPDATE, DELETE
  AS
  BEGIN
      -- SQL statements
  END;
Enter fullscreen mode Exit fullscreen mode

Modifying Tables with ALTER TABLE

Tables are among the most frequently modified objects in a database. The ALTER TABLE statement allows you to add, drop, or modify columns and constraints.

Adding a New Column

To add a new column to an existing table, you can use the following syntax:

ALTER TABLE Employees
ADD DateOfBirth DATE;
Enter fullscreen mode Exit fullscreen mode

This command adds a new column DateOfBirth of type DATE to the Employees table. If you need to add multiple columns, you can do so in a single statement:

ALTER TABLE Employees
ADD Gender CHAR(1),
    HireDate DATE;
Enter fullscreen mode Exit fullscreen mode

Dropping a Column

Dropping a column from a table is just as straightforward. However, be cautious when using this operation, as it will permanently remove the column and all its data:

ALTER TABLE Employees
DROP COLUMN DateOfBirth;
Enter fullscreen mode Exit fullscreen mode

Modifying a Column

You can change the data type or other properties of an existing column using the ALTER COLUMN clause:

ALTER TABLE Employees
ALTER COLUMN Gender VARCHAR(10);
Enter fullscreen mode Exit fullscreen mode

This command changes the Gender column's data type from CHAR(1) to VARCHAR(10).

Renaming a Column

SQL Server does not directly support renaming columns using the ALTER keyword. Instead, you can use the sp_rename stored procedure:

EXEC sp_rename 'Employees.Gender', 'Sex', 'COLUMN';
Enter fullscreen mode Exit fullscreen mode

This command renames the Gender column to Sex in the Employees table.

Adding and Dropping Constraints

Constraints are rules enforced on data columns. The ALTER TABLE statement allows you to add or drop constraints such as PRIMARY KEY, FOREIGN KEY, UNIQUE, and CHECK.

Adding a Primary Key:

  ALTER TABLE Employees
  ADD CONSTRAINT PK_Employees PRIMARY KEY (EmployeeID);
Enter fullscreen mode Exit fullscreen mode

Dropping a Primary Key:

  ALTER TABLE Employees
  DROP CONSTRAINT PK_Employees;
Enter fullscreen mode Exit fullscreen mode

Adding a Foreign Key:

  ALTER TABLE Orders
  ADD CONSTRAINT FK_Orders_Employees FOREIGN KEY (EmployeeID)
  REFERENCES Employees(EmployeeID);
Enter fullscreen mode Exit fullscreen mode

Dropping a Foreign Key:

  ALTER TABLE Orders
  DROP CONSTRAINT FK_Orders_Employees;
Enter fullscreen mode Exit fullscreen mode

Adding a Check Constraint:

  ALTER TABLE Employees
  ADD CONSTRAINT CHK_Gender CHECK (Gender IN ('M', 'F'));
Enter fullscreen mode Exit fullscreen mode

Dropping a Check Constraint:

  ALTER TABLE Employees
  DROP CONSTRAINT CHK_Gender;
Enter fullscreen mode Exit fullscreen mode

Modifying Views with ALTER VIEW

Views are virtual tables created by querying one or more tables. They are often used to simplify complex queries or to present a specific view of the data. The ALTER VIEW statement allows you to modify the definition of an existing view.

Modifying the Definition of a View

To modify an existing view, you can use the following syntax:

ALTER VIEW EmployeeDetails
AS
SELECT EmployeeID, FirstName, LastName, Department
FROM Employees
WHERE Active = 1;
Enter fullscreen mode Exit fullscreen mode

This command updates the EmployeeDetails view to include only active employees.

Adding a Computed Column to a View

You can also add computed columns to a view, which are calculated based on existing columns:

ALTER VIEW EmployeeDetails
AS
SELECT EmployeeID, FirstName, LastName, 
       Department, 
       Salary * 12 AS AnnualSalary
FROM Employees
WHERE Active = 1;
Enter fullscreen mode Exit fullscreen mode

Here, a new column AnnualSalary is added, calculated as Salary * 12.

Modifying Stored Procedures with ALTER PROCEDURE

Stored procedures are precompiled collections of SQL statements that can be executed as a single unit. The ALTER PROCEDURE statement allows you to modify the logic of an existing stored procedure.

Modifying the Logic of a Stored Procedure

To modify an existing stored procedure, you can use the following syntax:

ALTER PROCEDURE GetEmployeeDetails
    @EmployeeID INT
AS
BEGIN
    SELECT EmployeeID, FirstName, LastName, Department, HireDate
    FROM Employees
    WHERE EmployeeID = @EmployeeID;
END;
Enter fullscreen mode Exit fullscreen mode

This command updates the GetEmployeeDetails stored procedure to include the HireDate column in the result set.

Adding Error Handling to a Stored Procedure

You can also enhance a stored procedure by adding error handling using TRY...CATCH blocks:

ALTER PROCEDURE GetEmployeeDetails
    @EmployeeID INT
AS
BEGIN
    BEGIN TRY
        SELECT EmployeeID, FirstName, LastName, Department, HireDate
        FROM Employees
        WHERE EmployeeID = @EmployeeID;
    END TRY
    BEGIN CATCH
        SELECT ERROR_MESSAGE() AS ErrorMessage;
    END CATCH;
END;
Enter fullscreen mode Exit fullscreen mode

This modification adds error handling to the GetEmployeeDetails procedure, capturing and returning any error messages.

Modifying Functions with ALTER FUNCTION

Functions are similar to stored procedures but are designed to return a single value or table. The ALTER FUNCTION statement allows you to modify the logic of an existing function.

Modifying a Scalar Function

Scalar functions return a single value based on input parameters. Here's an example of modifying a scalar function:

ALTER FUNCTION GetFullName
    (@FirstName VARCHAR(50), @LastName VARCHAR(50))
RETURNS VARCHAR(100)
AS
BEGIN
    RETURN @FirstName + ' ' + @LastName;
END;
Enter fullscreen mode Exit fullscreen mode

This function returns the full name of an employee by concatenating the first and last names.

Modifying a Table-Valued Function

Table-valued functions return a table as their output. Here's an example of modifying such a function:

ALTER FUNCTION GetEmployeesByDepartment
    (@Department VARCHAR(50))
RETURNS TABLE
AS
RETURN
(
    SELECT EmployeeID, FirstName, LastName
    FROM Employees
    WHERE Department = @Department
);
Enter fullscreen mode Exit fullscreen mode

This function returns a list of employees in a specified department.

Modifying Triggers with ALTER TRIGGER

Triggers are special types of stored procedures that automatically execute in response to certain events on a table or view. The ALTER TRIGGER statement allows you to modify the logic of an existing trigger.

Modifying an AFTER INSERT Trigger

An AFTER INSERT trigger runs after a new record is inserted into a table. Here's how to modify such a trigger:

ALTER TRIGGER trgAfterInsertEmployee
ON Employees
AFTER INSERT
AS
BEGIN
    INSERT INTO EmployeeAudit (EmployeeID, Action, ActionDate)
    SELECT EmployeeID, 'INSERT', GETDATE()
    FROM inserted;
END;
Enter fullscreen mode Exit fullscreen mode

This trigger logs an insert action into the EmployeeAudit table whenever a new record is added to the Employees table.

Modifying an INSTEAD OF UPDATE Trigger

An INSTEAD OF UPDATE trigger intercepts an update operation and allows you to define custom logic. Here's an example:

ALTER TRIGGER trgInsteadOfUpdateEmployee
ON Employees
INSTEAD OF UPDATE
AS
BEGIN
    UPDATE Employees
    SET LastName = UPPER(LastName),
        FirstName = UPPER(FirstName)
    WHERE EmployeeID = (SELECT EmployeeID FROM inserted);
END;
Enter fullscreen mode Exit fullscreen mode

This trigger converts the `FirstName and LastName fields to uppercase whenever an update is made to the Employees table. The INSTEAD OF trigger provides a way to customize the behavior of the update operation, ensuring that all names are stored in uppercase.

Advanced Use Cases for the ALTER Keyword

Beyond basic modifications, the ALTER keyword can be used in more advanced scenarios, such as partitioning tables, enabling or disabling triggers, and managing indexes. These operations are crucial for optimizing performance and ensuring the smooth operation of large databases.

Partitioning Tables

Partitioning a table involves dividing it into smaller, more manageable pieces based on a specific column, such as a date or an ID. The ALTER keyword allows you to manage partitions effectively.

Creating a Partition Scheme

First, create a partition function that defines the boundaries for each partition:


CREATE PARTITION FUNCTION EmployeePF (INT)
AS RANGE LEFT FOR VALUES (1000, 2000, 3000);

Next, create a partition scheme that maps the partitions to file groups:


CREATE PARTITION SCHEME EmployeePS
AS PARTITION EmployeePF
TO (FileGroup1, FileGroup2, FileGroup3, FileGroup4);

Finally, use the ALTER TABLE statement to partition the table:


ALTER TABLE Employees
PARTITION BY SCHEME EmployeePS (EmployeeID);

This command partitions the Employees table based on the EmployeeID column, distributing data across multiple file groups.

Enabling and Disabling Triggers

Triggers can be enabled or disabled as needed using the ALTER TABLE or ALTER VIEW statements. This is useful for temporarily suspending trigger operations during bulk inserts or maintenance tasks.

Disabling a Trigger

To disable a trigger, use the following syntax:


ALTER TABLE Employees
DISABLE TRIGGER trgAfterInsertEmployee;

This command disables the trgAfterInsertEmployee trigger on the Employees table.

Enabling a Trigger

To enable a previously disabled trigger, use this syntax:


ALTER TABLE Employees
ENABLE TRIGGER trgAfterInsertEmployee;

This command re-enables the trgAfterInsertEmployee trigger.

Managing Indexes with ALTER INDEX

Indexes are essential for improving the performance of queries. The ALTER INDEX statement allows you to manage indexes by rebuilding, reorganizing, or disabling them.

Rebuilding an Index

Rebuilding an index defragments it and can improve performance. Here's how to rebuild an index:


ALTER INDEX IX_EmployeeID ON Employees
REBUILD;

This command rebuilds the IX_EmployeeID index on the Employees table.

Reorganizing an Index

Reorganizing an index is a less intensive operation than rebuilding. It defragments the index at the leaf level:


ALTER INDEX IX_EmployeeID ON Employees
REORGANIZE;

Disabling an Index

If an index is no longer needed, or if you need to disable it temporarily, use the following syntax:


ALTER INDEX IX_EmployeeID ON Employees
DISABLE;

Disabling an index makes it unavailable for use by the query optimizer but keeps it in place for future use.

Best Practices for Using the ALTER Keyword

While the ALTER keyword is powerful, it should be used with caution. Here are some best practices to follow:

Backup Before Altering: Always create a backup of your database before making significant changes. This ensures you can recover your data if something goes wrong.

Use Transactions: When making multiple changes, consider wrapping them in a transaction. This allows you to roll back all changes if any part of the operation fails.

`
BEGIN TRANSACTION;

ALTER TABLE Employees
ADD DateOfBirth DATE;

ALTER TABLE Employees
ADD Gender CHAR(1);

COMMIT TRANSACTION;
`

Test in a Development Environment: Always test your ALTER statements in a development environment before applying them to a production database. This helps catch potential issues before they affect live data.

Monitor Performance: After making changes, monitor the performance of your queries. Some alterations, like adding or modifying indexes, can have a significant impact on performance.

Document Changes: Keep detailed records of any changes made to your database schema. This documentation is invaluable for troubleshooting and auditing purposes.

Common Pitfalls and How to Avoid Them

Even experienced database administrators can run into issues when using the ALTER keyword. Here are some common pitfalls and how to avoid them:

Data Loss When Dropping Columns

Dropping a column will permanently remove the data it contains. Always double-check that the data is no longer needed before dropping a column. If you're unsure, consider archiving the data first.

Incompatible Data Type Changes

When altering a column's data type, ensure that the existing data is compatible with the new type. For example, changing a VARCHAR column to an INT will cause an error if the column contains non-numeric data.


ALTER TABLE Employees
ALTER COLUMN EmployeeID VARCHAR(10); -- Changing from INT to VARCHAR

Before making such changes, clean or transform the data to ensure compatibility.

Dependency Issues

Modifying or dropping objects like columns, tables, or procedures can have a ripple effect on dependent objects such as views, stored procedures, and functions. Always check for dependencies before making changes.

You can use the sp_depends stored procedure to check dependencies:


EXEC sp_depends 'Employees';

This command returns a list of objects that depend on the Employees table.

Index Fragmentation

Altering tables, especially when adding or dropping columns, can lead to index fragmentation. Regularly rebuild or reorganize indexes to maintain optimal performance.

Conclusion

The SQL Server ALTER keyword is a versatile and powerful tool for modifying database objects. Whether you're adding new columns to a table, updating the logic in a stored procedure, or managing indexes, the ALTER keyword provides the flexibility to make changes without disrupting your database's structure.

By following best practices, testing changes in a development environment, and being mindful of potential pitfalls, you can use the ALTER keyword to maintain and optimize your SQL Server databases effectively.

Reference Links

For further reading and detailed documentation, consider the following resources:

SQL Server ALTER TABLE Documentation

SQL Server ALTER PROCEDURE Documentation

SQL Server ALTER VIEW Documentation

SQL Server ALTER INDEX Documentation

Managing Indexes in SQL Server

SQL Server Partitioning Guide

This comprehensive guide should give you a strong understanding of how to use the ALTER keyword in SQL Server. By mastering this command, you can make your database management tasks more efficient and less prone to errors.

Top comments (0)